исключение mod_rewrite для определенного файла

Моя страница не перенаправляет должным образом из-за моего файла .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 в моем каталоге / 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>

Ответы на вопрос(2)

Решение Вопроса

Вы начинаете с первой (или следующей) записи 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. Каждый переписываемый запрос подвергается множеству интенсивных тестов ЦП. Сначала выполняется регулярное выражение RewriteRule, затем регулярное выражение в первом 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 связаны с [ИЛИ], поэтому первый 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'].

 Sterling Duchess12 окт. 2012 г., 22:41
Исправление это работает сейчас.
 Martin Sheeks14 янв. 2016 г., 23:27
Это настолько невероятно тщательно и требует гораздо больше, чем было дано.
 wallyk12 окт. 2012 г., 22:39
Спасибо! Я искал этот уровень объяснения месяцами.

Попробуйте с этим:

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
 user138632012 окт. 2012 г., 21:42
в вашем форуме .htaccess, установите это: RewriteRule. /forum/rewrite.php [L]
 Sterling Duchess12 окт. 2012 г., 21:32
Нет, это все еще сокращается до просто / форум /.
 Sterling Duchess12 окт. 2012 г., 21:41
Я нашел .htaccess в / forum /, который не мой, может быть причиной проблемы.
 user138632012 окт. 2012 г., 21:36
Я отредактировал свой фрагмент кода .. попробуйте сейчас.
 Sterling Duchess12 окт. 2012 г., 21:38
Нет по-прежнему вырезать, я проверил все файлы .htaccess на моем веб-сервере.

Ваш ответ на вопрос