
Я пытаюсь установить некоторые определенные заголовки на основе IP-адреса клиента через обратный прокси-сервер Apache. Я пытаюсь использоватьSetEnvIfNoCase/Установить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#Регулярные-выраженияОбратный слеш — правильный символ для экранирования метасимволов.
Есть предположения, в чем проблема?
решение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