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

时间:2018-01-01 19:26:48

标签: .htaccess error-handling custom-error-pages

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

2 个答案:

答案 0 :(得分:1)

如果这是关于你正在做的程度,那么它很好,但如果你要做很多重定向,我会考虑在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行为。)

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

还有一个额外的标志[R],我建议您注意并尽可能使用它,以便更轻松地使用HTTP响应代码保持良好实践。这些有助于搜索排名,我建议指定403响应,因为默认情况下它会抛出302错误,这会对排名产生负面影响。将规则更改为RewriteRule ^(.*)$ /.wrongip.php [R=403,L]会导致Apache服务器向浏览器发出 HTTP重定向(到 /.inkeipip.php )并传达403 Forbidden错误在标题中。由于我的示例将所有页面重定向到 /.inkeipip.php 以获取非白名单的IP,因此很可能甚至 /.inkeipip.php 本身,我认为在您的特定情况下,[R]标志将导致HTTP重定向循环,他们将继续请求 /.inkeipip.php 。在这种情况下,您应该省略[R]标志,这将导致Apache服务器执行内部重定向

如果没有[R]标记,客户端就不会知道此重定向已经开启(因此内部),因此您仍应模拟标题中的错误代码使用PHP的 /.inkeip.php 文件。

答案 1 :(得分:0)

我没有测试过,但我假设

<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.htmlhttps://httpd.apache.org/docs/trunk/mod/core.html#errordocument