Предположим, у меня есть простая структура каталогов, подобная следующей:
/var/www/html
- index.html
- 404.html
И простая конфигурация, подобная этой:
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName example.com
ErrorDocument 404 /404.html
</VirtualHost>
Как я могу предотвратить прямой доступ к 404.html , т.е. когда кто-то пытается получить доступ к http://example.com/404.html
напрямую, вернуть код состояния 404 НЕ НАЙДЕН плюс содержимое 404.html?
Прямо сейчас, если Я обращаюсь к URL напрямую, он вернет 200 OK. Если я попытаюсь изменить код состояния через mod_rewrite
:
<Location /404.html>
RewriteEngine On
RewriteRule .* - [R=404,L]
</Location>
, то фактический 404, например http://example.com/not-exist.html
вернет следующую ошибку:
Запрошенный URL /not-exist.html не найден на этом сервере.
Кроме того, произошла ошибка 404 Not Found при попытке использовать ErrorDocument для обработки запроса.
Итак, как я могу скрыть 404.html от посетителей, но по-прежнему использовать его в качестве настраиваемой страницы с ошибкой 404?
Посмотрев на аналогичную ситуацию , я нашел решение этой проблемы - есть переменная с именем REDIRECT_STATUS
[ ref ] , который будет установлен apache, когда apache найдет ErrorDocument внутри.
Таким образом, используя переменную, я могу добавить новое условие перезаписи, чтобы позволить apache исключить фактический 404 из перезаписи:
<Location /404.html>
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule .* - [R=404,L]
</Location>
и это решило мою проблему.