Apache mod_rewrite 如何通过 IP 进行限制

Apache mod_rewrite 如何通过 IP 进行限制

我想在几周内仅接受某些 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是非标准的,因此除非您明确知道这是要检查的标头,否则它将为空(重写映射查找将始终失败)。

  • 使用Rredirect ) 标志而不指定代换字符串(即。-)不做任何事物

  • 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-ForHTTP 请求标头(标准版本是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]

但请注意,您只能在以下情况下使用此方法:知道您的服务器位于代理后面 - 否则很容易被伪造。

相关内容