我们托管一个应用程序(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 即可。