当一个站点通过 2 个反向代理访问时,如何排除一定范围的 IP 地址?

当一个站点通过 2 个反向代理访问时,如何排除一定范围的 IP 地址?

我们托管一个应用程序(app1),可以通过反向代理(apache 2.2)。

  • 互联网用户的代理 A - 无规则适用

  • 代理 B 适用于企业用户(IP 地址 10.* 或 160.53.*)

有两个例外,我们希望排除两个范围,因为它们必须使用代理 A

  • 10.5.96.0/19(掩码 255.255.224.0)
  • 10.126.*

所以我们做了一个 RewriteRule

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/app1/.*
RewriteCond %{REMOTE_ADDR} !^10\.126\. [OR]
RewriteCond %{REMOTE_ADDR} !^10\.5\.(9[6-9]|1([0-1][0-9]|2[0-7]))\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$
RewriteCond %{REMOTE_ADDR} ^10\. [OR]
RewriteCond %{REMOTE_ADDR} ^160\.53\.
RewriteRule ^(.*)$ https://proxy2.aa.bb$1 [R]

因此我们首先检查排除“!^”

但是当使用应该排除的地址时,它仍然使用代理B。

我究竟做错了什么 ?

谢谢,迈克尔

答案1

这里有一个逻辑问题。记住或者这里优先于。使用 OR 运算符,在所有语言中,OR 的所有成员都会被逐一评估,直到其中一个返回 True(然后返回 true)或直到所有成员都被证明为 False(返回 false)。您的条件如下:

if (is not in 10.126.* OR is not in 10.5.96.0/19) AND (is in 10.* OR is in 160.53.*)

现在是不是更有意义了?对于 10.* 中的所有地址(包括您想要排除的地址),第一部分和第二部分始终计算为 True。只需将第一个 OR 改为 AND 即可。

相关内容