mod_rewrite перенаправляет все несопоставленные правила в общий файл - PullRequest
0 голосов
/ 18 ноября 2011

Все мои правила перезаписи настроены и работают в .htaccess, но мне нужно перенаправить все несопоставимые правила в общее место.

Вот правила:

# add trailing slash    
RewriteCond %{DOCUMENT_ROOT} -d
RewriteRule ^([^.]*[^/])$ $1/ [R]

# redirect directories to old site if it exists    
RewriteCond %{DOCUMENT_ROOT}/old_site/$0 -d
RewriteRule ^(.*) old_site/$1 [NC,QSA,L]

#redirect files to old site if they exist
RewriteCond %{DOCUMENT_ROOT}/old_site/$0 -f
RewriteRule ^(.*) old_site/$1 [NC,QSA,L]

Это прекрасно работает, но при попытке перенаправить оставшуюся часть трафика (все несопоставленные правила) в index.php просто перезаписывает все приведенные выше правила:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Как я могу гарантировать, что эта часть будет выполнена только в том случае, если ничто другое (я полагаю, кроме завершающей части косой черты) не было найдено?

EDIT: Согласно @Jon Lin, я изменил последние три строки на

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php

Что теперь работает для всего, кроме каталогов, которые не заканчиваются косой чертой. Я не могу поместить [L] в первое правило, потому что мне нужно, чтобы оно переписало дальше в другой каталог.

1 Ответ

1 голос
/ 18 ноября 2011

Это правило никогда не будет применено, потому что% {REQUEST_FILENAME} никогда не будет каталогом и , а не каталогом одновременно.Если вы хотите, чтобы существующие каталоги и файлы не переписывались (например, если вы ссылаетесь на изображение), включите следующие условия:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

Правило, которое вы используете, в порядке.Но вы можете добавить [L] в его конец.

Кроме того, первое правило, которое у вас есть, вы проверяете, является ли корень документа каталогом (это должно быть), это означает, что правило будетвсегда применяется, что означает, что /index.php будет переписано в /index.php/.Я думаю, что вы можете искать% {REQUEST_FILENAME} вместо% {DOCUMENT_ROOT}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...