我想在几周内仅接受某些 IP。
只有接受的 IP 才能加载该 IP ->www.example.com/login
而其他的则不能。
使用Apache 2.2。mod_rewrite中的代码如下:
RewriteMap hosts-allow txt:/conf/hosts-allow
RewriteCond "${hosts-allow:%{HTTP:X-REAL-IP}|NOT-FOUND}" "=NOT-FOUND"
RewriteRule ^/login/.* - [R]
我添加了我的IP来进行测试。
“hosts-allow” 文件包含我的 IP,如下所示
xxx.xxx.xxx
再次尝试如下:
RewriteCond %{REMOTE_ADDR} ^xxx\.xxx\.xxx\.xxx
RewriteCond %{HTTP_HOST} ^(m|www)\.example.com/login$ [NC]
RewriteRule ^/login(.*) [PT,L]
这些例子都不起作用。
有关更多信息,在尝试上述示例之前,我的 mod_rewrite 上的所有连接都会重定向到登录页面。我尝试使用下面的方法,它被example.conf
调用httpd.conf
<Location "/login" >
Order Deny,Allow
Deny from all
Allow from xxx.xxx.xxx.xxx
</Location >
我推测该指令example.conf
被 mod_rewrite 覆盖
mod_rewrite 是否在所有其他 conf 文件的最后激活?
答案1
RewriteMap hosts-allow txt:/conf/hosts-allow RewriteCond "${hosts-allow:%{HTTP:X-REAL-IP}|NOT-FOUND}" "=NOT-FOUND" RewriteRule ^/login/.* - [R]
这里有几个问题...
除非您使用某种代理服务器,否则不太
X-REAL-IP
可能设置。但是,X-REAL-IP
是非标准的,因此除非您明确知道这是要检查的标头,否则它将为空(重写映射查找将始终失败)。使用
R
(redirect
) 标志而不指定代换字符串(即。-
)不做任何事物。该
L
标志被省略,因此处理无论如何都会继续。你没有明确说明语境这些指令正在被使用(服务器,虚拟主机,目录或
.htaccess
),然而,图案^/login/.*
只会匹配服务器或者虚拟主机语境。
RewriteCond %{REMOTE_ADDR} ^xxx\.xxx\.xxx\.xxx RewriteCond %{HTTP_HOST} ^(m|www)\.example.com/login$ [NC] RewriteRule ^/login(.*) [PT,L]
再次,这里存在一些问题...
仅包含
HTTP_HOST
请求的主机名(例如www.example.com
),不包含 URL 路径。因此,上述尝试匹配的条件^(m|www)\.example.com/login$
永远不会成功。更新:然而,你需要检查请求的主机名? 您是否接受对多个主机/域的请求并且需要区分?
你还缺少代换指令中的字符串(第二个参数)
RewriteRule
。那么,[PT,L]
将被视为代换字符串将会被“打破”。
<Location "/login" > Order Deny,Allow Deny from all Allow from xxx.xxx.xxx.xxx </Location >
我推测 example.conf 上的指令被 mod_rewrite 覆盖
mod_rewrite 是否在所有其他 conf 文件的最后激活?
那么 mod_rewrite 实际上被处理了早期的. 各<Location>
部分已合并晚的不确定为什么这不起作用(没有看到其余的配置),除非 mod_rewrite 触发了外部重定向?
尝试使用 mod_rewrite 代替下面的方法。这需要前现有的 mod_rewrite 指令。
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^xxx\.xxx\.xxx\.xxx
RewriteRule ^/?login - [F]
哪里xxx.xxx.xxx.xxx
你的(外部)IP 地址。
这将为任何来自/login
以下 IP 地址的请求提供 403 Forbidden:不是一方说。
请注意,如果您的网站位于代理服务器后面,则这将不起作用,因为REMOTE_ADDR
始终是代理服务器的 IP 地址,而不是发出请求的用户的 IP 地址。
更新:如果该网站位于代理后面,我该怎么办?
您需要了解代理服务器传递客户端 IP 地址的方法。您可以通过分析到达应用服务器的 HTTP 请求标头来做到这一点(或询问代理服务器的管理员)。
事实上的标准是X-Forwarded-For
HTTP 请求标头(标准版本是Forwarded
标题- 但目前这种情况并不常见)。但是,这实际上可以是任何东西,例如X-REAL-IP
您在第一个示例中使用的东西。
请注意,X-Forwarded-For
标头是一个以逗号分隔的 IP 地址列表。客户端的 IP 地址排在最前面,后面是请求经过的每个代理服务器的 IP 地址(如果超过 1 个)。
例如,修改上面的(mod_rewrite)示例,变成:
RewriteCond %{HTTP:X-Forwarded-For} !^xxx\.xxx\.xxx\.xxx
RewriteRule ^/?login - [F]
但请注意,您只能在以下情况下使用此方法:知道您的服务器位于代理后面 - 否则很容易被伪造。