如何拒绝 Apache httpd 中对 ErrorDocument 的直接访问

如何拒绝 Apache httpd 中对 ErrorDocument 的直接访问

假设我有一个简单的目录结构,如下所示:

/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 NOT FOUND 状态代码,以及 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。

此外,尝试使用 ErrorDocument 处理请求时遇到 404 Not Found 错误。

那么,我怎样才能向访问者隐藏 404.html,但仍将其用作自定义 404 错误页面?

答案1

看过之后类似情况,我找到了这个问题的解决方案——有一个名为REDIRECT_STATUS[參考]当 apache 在内部查找 ErrorDocument 时,它将被 apache 设置。

因此,使用变量,我可以添加一个新的重写条件以允许 apache 排除实际的 404 被重写:

<Location /404.html>
    RewriteEngine On
    RewriteCond %{ENV:REDIRECT_STATUS} =""
    RewriteRule .* - [R=404,L]
</Location>

它解决了我的问题。

相关内容