Расширение Mod_Rewrite Удаление Изменения Функционирование 404 - PullRequest
3 голосов
/ 26 марта 2012

Когда я пытаюсь удалить мои расширения 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 ]

2 голосов
/ 26 марта 2012

Когда вы запрашиваете несуществующий файл, используя вышеуказанные условия перезаписи, вы сталкиваетесь с бесконечным перенаправлением.

Если вы обращаетесь к 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.

1 голос
/ 26 марта 2012
...