Моя страница не перенаправляется, поскольку она должна из-за моего файла .htaccess, который устанавливается как:
RewriteEngine on RewriteCond $1 !^(index\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Я использую эту настройку для своей MVC Framework, поэтому получаю URL-адреса, такие как /controller/method/argument
однако, когда я перенаправляюсь на /forum/login.php, он разрезает на / forum /.
Как я могу добавить это как исключение, так что я смогу перенаправить на /forum/login.php
Я нашел другой .htaccess в каталоге my / forum /, может ли это вызвать и проблему?
# BEGIN PunBB <IfModule mod_rewrite.c> # MultiViews interfers with proper rewriting Options -MultiViews RewriteEngine On # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly #RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . rewrite.php [L] </IfModule>
Сначала я расскажу вам, как читать RewriteRule:
Вы начинаете с первой (или следующей) записи RewriteRule:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Первый параметр – это регулярное выражение, которое может соответствовать вашему запрошенному URL. ^(.*)$
соответствует всем и сохраняет это «все» внутри переменной, которая может быть использована позже.
Только если есть предыдущие записи RewriteCond, они оцениваются следующим образом:
RewriteCond $1 !^(index\.php|resources|robots\.txt)
$1
– это ссылка на контент, согласованный в первых круглых скобках RewriteRule. Это сравнивается со вторым параметром, который является регулярным выражением, содержащим несколько явных имен, и значение !
исключает выражение, например, это правило допускает выполнение RewriteRule только в том случае, если регулярное выражение не совпадает. Если это условие возвращает true, будет рассмотрено следующее условие.
RewriteCond %{REQUEST_FILENAME} !-f
Если запрошенное имя файла не является реальным файлом на жестком диске, это условие истинно.
RewriteCond %{REQUEST_FILENAME} !-d
Если запрошенное имя файла не является реальным каталогом, это условие истинно.
Только если все эти условия верны (они связаны вместе с AND), мы возвращаемся к правилу перезаписи:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Результат этого этапа перезаписи определяется как второй и третий параметр. $1
используется снова, как и содержимое совпадения, и параметры определяют, что это правило, если оно первоначально согласовано, будет последним правилом (L) и что любая строка запроса, определенная в целевой переменной переписывания, будет добавлена к любой строке запроса в исходном URL (QSA).
Критика:
Обычная переработка для фреймворков MVC должна быть максимально возможной. Все условия перезаписи должны быть оценены для успешной перезаписи. Показ остановится только в том случае, если какой-либо из RewriteCond возвращает false. Каждый запрос, который переписывается, подвергается множеству интенсивных тестов cpu. Сначала RewriteRule regex, затем регулярное выражение в первом RewriteCond, за которым следуют два теста жесткого диска в файловой системе для существования файла.
С другой стороны, первый RewriteCond кажется ненужным. Он проверяет определенные имена и, если найден, отменяет переписывание. «index.php» должен быть обнаружен вторым RewriteCond, поскольку он является существующим файлом (как будет работать переписывание, если нет). Все, что начинается с «ресурсов», также будет сопоставлено, но, вероятно, не должно по тем же причинам: Существующие ресурсы будут найдены вторым RewriteCond. Последний файл "robots.txt". Всегда полезно иметь один, возможно, emtpy, если вы хотите избежать 404, когда роботы забирают ваш сайт.
Поскольку вы ничего не меняете в строке запроса, директива [QSA] не нужна.
Улучшения:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [L] RewriteRule ^.*$ index.php [L]
Первый RewriteRule будет соответствовать всему запрошенному пути. Два RewriteCond связаны с [OR], поэтому первый RewriteCond, который возвращает true, отменит дальнейшую оценку. Первый RewriteCond проверяет, существует ли запрошенный файл. Если он существует, он возвращает true, и обработка возвращается к первому RewriteRule. Целевое выражение – «-», что означает «не переписывать». [L] останавливает дальнейшую обработку правил перезаписи. Итак, в конце, для существующего файла мы имеем только одно регулярное выражение и один тест файловой системы, и после этого этот существующий файл будет отправлен в браузер.
Если файл не найден, первые RewriteRule и RewriteCond не будут запускаться, поэтому [L] не остановит процесс. Таким образом выполняется второй RewriteRule. Это безусловное, а регулярное выражение такое же, как и раньше, сопоставляя все и переписывая его на «index.php».
Это переписывание не будет вызывать ваш index.php, если какой-либо файл существует, в том числе /forum/login.php.
Вы можете изменить второй на RewriteRule ^.*$ index.php/$0 [L]
если вы хотите продолжить синтаксический анализ $_SERVER['PATH_INFO']
вместо $_SERVER['REQUEST_URI']
.
Попробуйте следующее:
RewriteEngine on RewriteCond $1 !^(index\.php|forum|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L,QSA]
И это:
# BEGIN PunBB # ---------------------------------------------------------------------- # Start rewrite engine # ---------------------------------------------------------------------- <IfModule mod_rewrite.c> # MultiViews interfers with proper rewriting Options -MultiViews RewriteEngine On # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly RewriteBase /forum/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . rewrite.php [L] </IfModule> # ---------------------------------------------------------------------- # Better website experience for IE users # ---------------------------------------------------------------------- # Force the latest IE version, in various cases when it may fall back to IE7 mode # github.com/rails/rails/commit/123eb25#commitcomment-118920 # Use ChromeFrame if it's installed for a better experience for the poor IE folk <IfModule mod_setenvif.c> <IfModule mod_headers.c> BrowserMatch MSIE ie Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie </IfModule> </IfModule> <IfModule mod_headers.c> # Because X-UA-Compatible isn't sent to non-IE (to save header bytes), # We need to inform proxies that content changes based on UA Header append Vary User-Agent # Cache control is set only if mod_headers is enabled, so that's unncessary to declare </IfModule> # ---------------------------------------------------------------------- # UTF-8 encoding # ---------------------------------------------------------------------- # Use UTF-8 encoding for anything served text/plain or text/html AddDefaultCharset utf-8 # Force UTF-8 for a number of file formats AddCharset utf-8 .html .css .js .xml .json .rss # ---------------------------------------------------------------------- # A little more security # ---------------------------------------------------------------------- # Do we want to advertise the exact version number of Apache we're running? # Probably not. ## This can only be enabled if used in httpd.conf - It will not work in .htaccess # ServerTokens Prod # "-Indexes" will have Apache block users from browsing folders without a default document # Usually you should leave this activated, because you shouldn't allow everybody to surf through # every folder on your server (which includes rather private places like CMS system folders). <IfModule mod_autoindex.c> Options -Indexes </IfModule> # END PunBB