
Ich versuche, einige spezifische Header basierend auf der Client-IP-Adresse über einen Apache-Reverse-Proxy festzulegen. Ich versuche zu verwendenSetEnvIfNoCase/SetEnvIfaber irgendwie gelingt es mir nicht, einen korrekten regulären Ausdruck zu schreiben :(
Folgendes habe ich versucht, in httpd.conf einzustellen (nehmen wir an, dass die Reverse-Proxy-Direktiven in Ordnung sind – das sind sie):
SetEnvIfNoCase Remote_Addr "192\.168*" user_location_internal
RequestHeader set x-acme-user-location internal env=user_location_internal
Nehmen wir an, die Anfrage kommt von 192.168.1.100. Dann sollte der reguläre Ausdruck übereinstimmen - ich habe es in mehreren Online-Validatoren versucht, die behaupten, Perl-kompatibel zu sein, und 192.168.1.100 stimmt mit "192.168*" überein. Die Dokumentation von SetEnvIf behauptet auch, Perl-reg-ex-kompatibel zu sein.
Es funktioniert jedoch nicht. Die einzige Syntax, die funktionierte, war folgende:
SetEnvIfNoCase Remote_Addr 192* user_location_internal
RequestHeader set x-acme-user-location internal env=user_location_internal
Dann wird der Header gesetzt, sodass das Problem irgendwie mit der Syntax des regulären Ausdrucks zusammenhängt. Meine beste Vermutung ist also, dass ich den Punkt nicht richtig maskiere. Allerdings laut:http://perldoc.perl.org/perlre.html#Regular-ExpressionsDer Backslash ist das richtige Symbol zum Escapen von Metazeichen.
Irgendwelche Vermutungen, was nicht stimmt?
Antwort1
Der mit der IP übereinstimmende reguläre Ausdruck könnte lauten:
SetEnvIfNoCase Remote_Addr ^192\.168.* user_location_internal
Beachten Sie den .*
Teil. Ohne den Punkt funktioniert es, weil null oder mehr Mal 192*
bedeutet , was mit dem übereinstimmt :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