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

问题描述 投票:3回答:2

1.

我有一个.htaccess文件,要求您从某个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

.htaccess error-handling custom-error-pages
2个回答
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重定向(到/.wrongip.php)并在标头中传递403 Forbidden错误。由于我的示例将所有页面重定向到/.wrongip.php以获取非白名单IP,很可能甚至是/.wrongip.php本身,我认为在您的特定情况下,[R]标志将导致HTTP重定向循环,他们会继续请求/.wrongip.php。在这种情况下,您应该省略[R]标志,这将导致Apache服务器执行内部重定向。

如果没有[R]标志,客户端将不知道此重定向继续(因此是内部),因此您仍应使用PHP模拟/.wrongip.php文件的标头中的错误代码。


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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.