如何使用mod_rewrite仅允许特定IP地址访问网站?

9
我们网站上有一个目录,我们只希望有几个IP地址可以访问。因此,我们使用这个.htaccess文件来尝试使其工作:
RewriteEngine on
RewriteCond %(REMOTE_ADDR) !^123\.123\.123\.123
RewriteCond %(REMOTE_ADDR) !^124\.124\.124\.124
RewriteCond %{REMOTE_ADDR} !^125\.125\.125\.125
RewriteCond %{REMOTE_ADDR} !^126\.126\.126\.126
RewriteCond %{REMOTE_ADDR} !^127\.127\.127\.127
RewriteCond %{REMOTE_ADDR} !^128\.128\.128\.128

RewriteCond %{HTTP_REFERER} !^http://www\.example\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^http://example\.com/ [NC]

RewriteRule ^.*$ http://www.example.com [R=301,L]

我们想要的是,如果请求不来自我们的IP地址之一(显然在上面的代码中只是为了举例而更改了它们),或者引荐者不来自特定网站,则将其重定向到其他地方。
由于某种奇怪的原因,它可以处理位于126.126.126.126位置的IP,但无法处理其他IP。真的无法想象为什么会因IP而异。可能出了什么问题?
我知道这会带来安全问题,因为引荐者可能被欺骗,但我们很快就会提出更好的解决方案,这只是一个临时措施。

你是否使用了同一个浏览器?难道你没有在浏览器地址栏中输入网站的URL吗?(这样引用者就会为空) - Nicolas
我已经尝试了新的浏览器,以确保这不是缓存问题。而且,直接在新的浏览器窗口中输入URL应该可以工作。其中一个IP地址可以正常工作。只有在没有IP匹配时才需要引用者。因此,如果他们(不来自IP1和不来自IP2和不来自IP3...并且引用者不来自x站点),那么就将其删除。 - BT643
2个回答

18

忘记发布答案了。结果只是最后一个字母打错了……唉!

如果你注意到,一些 %{REMOTE_ADDR} 行有花括号,而另一些行则有普通括号!它们都需要用花括号。

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123
RewriteCond %{REMOTE_ADDR} !^124\.124\.124\.124
RewriteCond %{REMOTE_ADDR} !^125\.125\.125\.125
RewriteCond %{REMOTE_ADDR} !^126\.126\.126\.126
RewriteCond %{REMOTE_ADDR} !^127\.127\.127\.127
RewriteCond %{REMOTE_ADDR} !^128\.128\.128\.128

RewriteCond %{HTTP_REFERER} !^http://www\.example\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^http://example\.com/ [NC]

RewriteRule ^.*$ http://www.example.com [R=301,L]

-3

我想你应该在每个RewriteCond后面添加[OR]修饰符,像这样:

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123 [OR]
RewriteCond %{REMOTE_ADDR} !^124\.124\.124\.124 [OR]
...

7
这是错误的 - 请仔细思考。使用“[OR]”逻辑规则将始终匹配,因为IP地址永远不会是列表中的任何一个,因此每个人都将被重定向,而不考虑他们的IP地址。 - But those new buttons though..
如果您要列出白名单IP,则可以使用“OR”,而不是对于黑名单IP :-) - Erenor Paz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接