Перезапись htaccess вызывает ошибку 500 вместо 404 - PullRequest
3 голосов
/ 17 ноября 2009

Я недавно добавил этот небольшой кусочек кода в мой .htaccess файл:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]

Хорошо, я понимаю, что здесь происходит, я думаю. Этот небольшой кусочек кода для удаления расширений файлов PHP вызывает цикл, если документ не найден. Этот цикл вызывает ошибку сервера 500 вместо (правильного) 404. К сожалению, я очень мало понимаю, что на самом деле делают эти перезаписи, поэтому я не знаю, как переписать его, чтобы вызвать только перенаправление, если документ существует.

Я немного прочитал, и я не уверен, что Apache считает "обычным" файлом. Я имею в виду, что это работает, но почему первая строка не будет -f вместо !-f? -u единственный способ сделать это?

Ответы [ 3 ]

20 голосов
/ 17 ноября 2009

Вы должны проверить, указывает ли новый путь на существующий файл:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]

В противном случае вы получите бесконечную рекурсию (ошибка 500).

2 голосов
/ 17 ноября 2009

Цель этих правил, как вы и предлагали, - разрешить кому-либо запрашивать страницу без добавления расширения PHP. Так что если у вас есть файл на example.com с именем about.php , тогда кто-то сможет использовать URL http://example.com/about для доступа к нему.

Однако, если кто-то запрашивает http://example.com/about.php напрямую, вы не хотите, чтобы он был переписан как http://example.com/about.php.php. Аналогично, вам не нужны запросы на изображения, таблицы стилей CSS и т. Д быть переписан. Это то место, где приходят 2 RewriteConds, это условия, согласно которым перезапись должна выполняться только в том случае, если запрос не соответствует файлу (!-f) или каталогу (!-d), который фактически существует на сайте.

Чтобы ответить, почему вы получаете 500, это может быть потому, что разрешения в Apache настроены так, чтобы не разрешать правила перезаписи в файле htaccess, или по одной из нескольких других причин. Проверьте конец вашего error_log, чтобы увидеть, есть ли там какие-либо сообщения.

0 голосов
/ 17 ноября 2009

Прежде всего, вот несколько ссылок, чтобы лучше понять модуль mod_rewrite:

mod_rewrite Документация

шпаргалка mod_rewrite

Проблема, с которой вы сталкиваетесь, заключается в том, что она проверяет оба условия, по умолчанию используется [AND], когда вы хотите проверить только одно, попробуйте следующее:

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...