如何在 .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.
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.