Удаление расширения перезаписи Мод Изменяет функционирование 404
Когда я пытаюсь удалить расширения PHP из всех своих файлов, используя файл .htaccess на моем сервере Apache, все работает отлично. Расширения удалены, и все выглядит намного лучше.
Однако у меня есть одна небольшая проблема: когда я обычно захожу на такую страницу, как ./nonexistent.php
, я получаю ошибку 404. Но, когда я переписываю свои URL-адреса и перехожу к ./nonexistent
, вместо этого я получаю 500 Internal Server Error
.
В идеале я хотел бы просто перенаправить своего пользователя на пользовательскую страницу "Страница не найдена", но я в настоящее время не могу найти способ сделать это.
Вот код, который я использую:
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php
Я попробовал установить: ErrorDocument 500 /nope
, однако, похоже, это тоже не имеет эффекта.
Итак, в заключение, знает ли кто-нибудь, как переписать расширения, сохраняя при этом то же функционирование системы "Страница не найдена", которая используется по умолчанию?
2 answers
Когда вы запрашиваете несуществующий файл, используя вышеуказанные условия перезаписи, вы сталкиваетесь с бесконечным перенаправлением.
Если вы обращаетесь к http://yoursite.com/i-dont-exist
, первое условие оценивается как истинное, i-dont-exist
- несуществующий файл, поэтому он попытается переписать в i-dont-exist.php
, которого также не существует, поэтому шаблон перезаписи продолжается до тех пор, пока Apache не ограничит рекурсию и не выдаст вам ошибку 500 (по сути, он постоянно переписывается в i-dont-exist.php.php.php.php.php...php
, пока вы не столкнетесь с ошибкой 500 ошибка.
Вы можете решить эту проблему, добавив дополнительную проверку, чтобы убедиться, что файл с расширением .php
существует перед перезаписью.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f #make sure $1.php exists before rewriting
RewriteRule ^(.*)$ $1.php
Если file.php
существует, то он будет переписан на него, в противном случае этого не произойдет, и будет подана страница с ошибкой 404.