我想在几周内只接受某些 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 进行测试。
带有我的 IP 的“hosts-allow”文件如下
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 >
我认为 on 的指令example.conf
被 mod_rewrite 覆盖
mod_rewrite 是否在所有其他 conf 文件的最后激活?
这里有几个问题...
除非您在
X-REAL-IP
某种代理服务器后面,否则不太可能设置。但是,X-REAL-IP
它是非标准的,因此除非您明确知道这是要检查的标头,否则它将为空(rewrite-map 查找将始终失败)。使用
R
(redirect
) 标志而不指定替换字符串(即。-
)不会做任何事情。该
L
标志被省略,因此无论如何处理都会继续。您没有明确说明使用这些指令的上下文( server、virtualhost、directory或
.htaccess
),但是,该模式^/login/.*
仅在server或virtualhost上下文中匹配。同样,这里有一些问题......
HTTP_HOST
仅包含请求的主机名(例如。)www.example.com
,它不包含 URL 路径。因此,上述尝试匹配的条件^(m|www)\.example.com/login$
将永远不会成功。更新:但是,您是否需要检查请求的主机名?您是否接受对多个主机/域的请求并且需要区分?
您还缺少指令中的替换字符串(第二个参数)
RewriteRule
。好吧,[PT,L]
将被视为只是“中断”的替换字符串。嗯,mod_rewrite 实际上是提前处理的。并且
<Location>
部分合并较晚。不知道为什么这不起作用(没有看到你的配置的其余部分),除非 mod_rewrite 触发了外部重定向?尝试以下类似的方法,而不是使用 mod_rewrite。这需要在现有的 mod_rewrite 指令之前进行。
您的
xxx.xxx.xxx.xxx
(外部)IP 地址在哪里。这将为任何从非指定 IP 地址开始的请求提供403
/login
Forbidden 。请注意,如果您的站点位于代理服务器后面,这将不起作用,因为
REMOTE_ADDR
将始终是代理服务器的 IP 地址,而不是发出请求的用户。您需要知道代理服务器传递客户端 IP 地址的方法。您可以通过分析到达您的应用程序服务器的 HTTP 请求标头来执行此操作(或询问代理服务器的管理员)。
事实标准是
X-Forwarded-For
HTTP 请求标头(标准化版本是Forwarded
标头- 但目前这种情况远不常见)。但是,这实际上可以是任何东西,例如X-REAL-IP
您在第一个示例中使用的。请注意,
X-Forwarded-For
标头是 IP 地址的逗号分隔列表。首先是客户端的IP地址,后面是请求经过的每个代理服务器的IP地址(如果超过1个)。例如,修改上面的 (mod_rewrite) 示例,变为:
但请注意,如果您知道您的服务器位于代理后面,则仅应使用此方法 - 因为否则很容易伪造。