2017-05-18 6 views
0

Ich werde diese Frage selbst beantworten, da ich darauf gestoßen bin und kein einziges Google-Ergebnis gefunden habe, um zu helfen. Hoffentlich kann das einige zukünftige Personen retten.RewriteMap mit Textoption gibt immer kein Ergebnis zurück

In Apache2.2, ich habe eine RewriteMap wie diese gestaltet, auf eine URL zu umleiten, wenn ein bestimmtes Query-String-Argument vorhanden ist:

RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt" 

RewriteCond %{QUERY_STRING} (^|&)foo=([^&]+) [NC] 
RewriteCond ${redirect:%1} !^$ 
RewriteRule ^.*$ ${redirect:%1} [301,L] 

Und /etc/arbitrary1/arbitrary2/redirect.txt:

foo http://hello.invalid/somepath/1 # 1 
bar http://hello.invalid/somepath/2 # 2 
baz http://hello.invalid/somepath/3 # 3 

Das Problem Ich lief darin war, egal, welche von "foo, bar, baz" ich verwendete, die ${redirect:%1} Direktive würde leer (dh "keine Übereinstimmung") zurückgeben. Dies war unabhängig von dem Format redirect.txt. SIEHE UNTEN FÜR WAS ICH ENTDECKT HABE.

Antwort

0

Das Problem endete damit, dass das Zwischenverzeichnis /etc/arbitrary1 keine Ausführungsberechtigungen für den Benutzer www-data hatte. Der Grund, warum dies so lange dauerte zu entdecken, war, weil, offensichtlich, die suid von Root nach die Prüfung auf Datei Existenz stattfindet. Das heißt, wenn ich RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt" zu RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/doesnotexist.txt" änderte, würde Apache einen Fehler beim Neustart geben, der anzeigte, dass es kein Problem hatte, wenn /etc/arbitrary1/arbitrary2/redirect.txt wenn Config geladen wurde. Da Apache es beim Start gefunden hat, nahm ich an, dass es auch während der Ausführung darauf zugreifen konnte (was sich als schlechte Annahme herausstellte). Als ich /etc/arbitrary1 eine Ausführungs-Perm gab, die www-Daten (entweder chown www-data:www-data /etc/arbitrary1 oder chmod o+x /etc/arbitrary1) entsprach, funktionierte die Karte gut.

Verwandte Themen