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 3

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 будет обслуживаться.