Mod перезаписать расширение удаление изменений функционирование 404
Когда я пытаюсь удалить мои расширения PHP из всех моих файлов, используя my .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 ответа:
Когда вы запрашиваете несуществующий файл, используя вышеуказанные условия перезаписи,вы сталкиваетесь с бесконечным перенаправлением.
Если вы обращаетесь к
http://yoursite.com/i-dont-exist
, Первое условие-оценка true,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 будет обслуживаться.