
我試圖透過 Apache 反向代理根據客戶端 IP 位址設定一些特定標頭。我嘗試使用SetEnvIfNoCase/SetEnvIf但我不知何故未能寫出正確的正規表示式:(
這是我嘗試在 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