На моем веб-сайте у меня есть следующий код, чтобы опустить расширение страниц php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Я также добавил этот код, чтобы показать пользовательские 404 страницы
ErrorDocument 404 /404
Оба они работают независимо, но не вместе. Когда я перехожу по фиктивной ссылке, такой как www.mydomain.com/pagethatdontexist , я хочу увидеть свою страницу 404, вместо этого я вижу ошибку «Файл не найден», которая, я думаю, исходит от сервера, поэтому я получаю 404 на 404 видимо.
Я пробовал перемещать ErrorDocument
выше и ниже кода удаления расширений, а также пробовал /404.php
. Я также попытался создать исключение для 404, например
RewriteCond %{REQUEST_URI} !^/404.php$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Ничего не работает.
Изменить:Когда код расширения удален и я захожу на www.mydomain.com/pagethatdontexist я вижу свою страницу 404. Но если я зайду www.mydomain.com/pagethatdontexist.php , я увижу мягкую ошибку «Файл не найден» с сервера. Возможно, это может дать ключ к пониманию того, что происходит.
Насколько я понимаю, вы используете сервер LiteSpeed, а не Apache? Это должно "работать" на Apache, но не на LiteSpeed из-за того, что серверные переменные не обновляются между внутренними запросами.
Однако в этом нет необходимости, (и вы не должны)опускать расширение файла в самой директиве ErrorDocument
. URL-адреса без расширений являются «косметическими» для пользователей. ErrorDocument полностью скрыт от пользователей. Но если вы опустите расширение файла в директиве ErrorDocument
, это вызовет дополнительную внутреннюю перезапись после внутреннего подзапроса для документа об ошибке -, которого следует избегать.
Таким образом, вы должны указать расширение файла в директиве ErrorDocument
:
ErrorDocument 404 /404.php