我正在尝试通过 Apache 反向代理根据客户端 IP 地址设置一些特定的标头。我尝试使用设置EnvIfNoCase/设置EnvIf但我不知何故没能写出正确的正则表达式:(
这是我尝试在 httpd.conf 中设置的内容(假设反向代理指令没有问题 - 它们是可以的):
SetEnvIfNoCase Remote_Addr "192\.168*" user_location_internal
RequestHeader set x-acme-user-location internal env=user_location_internal
假设请求来自 192.168.1.100。那么正则表达式应该匹配 - 我在几个声称符合 perl 标准的在线验证器中尝试过,192.168.1.100 与“192.168*”匹配。SetEnvIf 的文档也声称符合 perl reg ex。
但是它不起作用。唯一有效的语法如下:
SetEnvIfNoCase Remote_Addr 192* user_location_internal
RequestHeader set x-acme-user-location internal env=user_location_internal
然后设置了标题,因此问题在某种程度上与正则表达式语法有关。所以我最好的猜测是我没有正确地转义点。然而根据:http://perldoc.perl.org/perlre.html#Regular-Expressions反斜杠是转义元字符的正确符号。
猜猜哪里出了问题?
答案1
匹配 IP 的正则表达式可以是:
SetEnvIfNoCase Remote_Addr ^192\.168.* user_location_internal
注意这.*
部分。没有点,它仍然有效,因为192*
表示192
零次或多次,这与 匹配Remote_Addr
:
$ pcretest
PCRE version 8.33 2013-05-28
re> /^192*/
data> 192.foo.bar.baz
0: 192
re> /^192\.168.*/
data> 192.168.12.12
0: 192.168.12.12
data> 192.167.23.45
No match