Удаление расширения перезаписи Мод Изменяет функционирование 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, однако, похоже, это тоже не имеет эффекта.

Итак, в заключение, знает ли кто-нибудь, как переписать расширения, сохраняя при этом то же функционирование системы "Страница не найдена", которая используется по умолчанию?

Author: elliottbolzan, 2012-03-26

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.

 2
Author: drew010, 2012-03-25 22:10:36