Простой вопрос RewriteRule - PullRequest
       4

Простой вопрос RewriteRule

4 голосов
/ 09 сентября 2010

Это кажется таким простым, но я не могу понять ... Я бы хотел, чтобы все запросы были переписаны в index.php (который будет интерпретировать запрос) , кроме 404.html, который следует переписать напрямую в 404.php.

Следующий код работает при переписывании всего в index.php, но 404.php не запускается.

Я оставил комментарий в третьей строке, потому что не знаю, что он делает.

Options +FollowSymlinks
RewriteEngine on
#RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^404.html$ 404.php [L]
RewriteRule ^(.*)$ index.php  [QSA]

Как видите, мои потребности очень просты, но мой мозг тоже! Пожалуйста, помогите!

Спасибо.

EDIT

Эта строка отлично работает сама по себе:

RewriteRule ^404.html$ 404.php

но когда вводится другой RewriteRule, все принудительно запускается через index.php - даже 404.html ...... (я тоже пытался изменить порядок).

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Вы можете инвертировать результат матча, предварительно добавив !. Итак:

RewriteRule ^404\.html$ 404.php
RewriteRule !^404\.html$ index.php [QSA]

Это будет соответствовать любому запросу, путь которого не соответствует ^404\.html$.

Возможно, вам потребуется добавить закомментированное условие:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^404\.html$ index.php [QSA]

Теперь это правило будет соответствовать, только если запрос не может быть дополнительно сопоставлен с существующим файлом.

0 голосов
/ 09 сентября 2010

Это сводило меня с ума MAD! но я нашел ответ для тех, кто запутался, как я.

Посмотрите на строку 4:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^404.html$ 404.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php

Взято из: easymodrewrite :

Флаг [L] может привести к неожиданным результатам, если вы не знаете, как работает модуль.Обратите внимание, что следующее применимо, только когда mod_rewrite используется в файле .htaccess.Флаг [L] ведет себя точно так, как ожидается, когда используется в httpd.conf.

Флаг L скажет Apache прекратить обработку правил перезаписи для этого запроса.Теперь часто нереализованным является то, что теперь он делает новый запрос на новое, переписанное имя файла и снова начинает обработку правил перезаписи.


По сути, вы должны сказать второму правилу, что он не соответствует существующим файлам(404.php - настоящий файл, а не динамический).

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 09 сентября 2010

Я предлагаю это решение:

Options +FollowSymlinks
RewriteEngine on
#RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^404.html$ 404.php [L]
RewriteRule ^(.*)$ index.php  [QSA]

Я считаю, что проблема заключается в том, что вы переписываете URL-адрес в 404.php, а затем отправляете его в index.php.Если поставить [L] после первого правила, механизм переписывания не будет продолжать переписывать.

...