如何在 .haccess 中有两个不同的自定义错误页面?

How to have two different custom error pages in .haccess?

1.

我有一个 .haccess 文件,需要您从特定 IP 地址访问:

<RequireAll>
    Require ip XX.XX.XX.XX.XX YY.YY.YY.YY.YY ZZ.ZZ.ZZ.ZZ.ZZ
</RequireAll>

如果有人试图从 X、Y 或 Z 以外的 IP 访问该网站,他们会收到一个错误 403 Forbidden 页面。我使用以下内容对其进行了自定义:

ErrorDocument 403 /.forbidden.php

2.

如果有人试图访问同一目录中的受限文件(即使他们来自 IP 地址 X、Y 或 Z),他们会再次提示 SAME 自定义403 Forbidden 页。

我的问题

如何根据禁止访问的原因创建两个不同的自定义 403 Forbidden 页面?在示例 1 中,禁止页面将 /.wrongip.php,在示例 2 中,禁止页面将 /.restricted.php

我还没有测试过,但我假设是这样的

<Directory /var/www/mysite>
    ErrorDocument 403 /.restricted.php
    <RequireAll>
        Require ip XX.XX.XX.XX.XX YY.YY.YY.YY.YY ZZ.ZZ.ZZ.ZZ.ZZ
        ErrorDocument 403 /.wrongip.php
    </RequireAll>
</Directory>

可以做到这一点。

看看 https://httpd.apache.org/docs/trunk/custom-error.html and https://httpd.apache.org/docs/trunk/mod/core.html#errordocument 了解有关此类配置如何工作的更多信息。

如果这是关于您正在做的事情的程度,那很好,但是如果您要进行大量重定向,我会考虑在 PHP 中这样做,但我离题了。您将不得不使用 Apache (2.4) 模块 mod_rewrite 来重写 IP 限制部分的规则和条件。我会像处理该状态代码的其他情况一样保留您的自定义 403 Forbidden。如果您在共享主机上,大多数主机提供商通常默认启用此模块。

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^111.222.333.444$
RewriteRule ^(.*)$ /.wrongip.php [L]

如果将规则重写放在 .htaccess 文件的顶部附近,您可能会避免混淆。您的文件中只需要 RewriteEngine On 行一次。 RewriteCond 是紧随其后的规则的条件之一。您可以将多个条件映射到单个规则(使用 [OR] 标志;默认情况下为 AND 行为)。

在此解决方案中,^ 字符表示字符串的开头。同样,$ 表示结束。因此,^(.*)$ 是一个通配符,可以匹配在您的服务器上访问的任何文件。前面有一个 space 分隔符, /.wrongip.php 部分表示要重定向到的自定义错误页面。 [L] 是指示 Apache 服务器在匹配该规则后应停止处理其他规则的标志。除非你使用多个规则来构造一个URL,否则你可能会很头疼。

还有一个附加标志 [R],我建议您注意并尽可能尝试使用它,以便更轻松地使用 HTTP 响应代码来保持良好的做法。这些有助于搜索排名,我建议指定 403 响应,因为默认情况下它会抛出 302 错误,随着时间的推移会对排名产生负面影响。将规则更改为 RewriteRule ^(.*)$ /.wrongip.php [R=403,L] 会导致 Apache 服务器向浏览器发出 HTTP 重定向 (到 /.wrongip.php) 并在 header 中传达 403 禁止错误。因为我的例子有 all 页面重定向到 /.wrongip.php non-whitelisted IP,甚至很可能 /.wrongip.php 本身,我认为在你的具体情况下 [R] 标志会导致 HTTP 重定向循环,他们会继续请求 /.wrongip.php。在这种情况下,您应该省略 [R] 标志,这将导致 Apache 服务器执行 内部重定向

没有 [R] 标志,客户端将不知道此重定向继续进行(因此 internal),因此您仍然应该模拟错误代码在 /.wrongip.php 文件的 header 中使用 PHP.