Wie kann LocationMatch und ProxyPassMatch Kombiniert werden?
Ich bin einrichten eines Apache 2.4.6-server auf einer internen Maschine zu Testzwecken. Eines der Dinge, dass der Apache-server ist eigentlich zu tun ist, zu handeln als reverse-proxy für einen anderen server auf localhost:3030.
Den server auf localhost:3030 erwartet, dass eine von ein paar dataset-Namen, die auf den ersten Pfad-Ebene (jetzt das set besteht nur aus dem dataset experimental
, aber mehr wird Hinzugefügt werden, die später auf), so dass ich versuche zu pass, dass durch die von den angefragten Pfad.
In meiner vhost funktioniert:
<Location /experimental/>
ProxyPass http://localhost:3030/experimental/
ProxyPassReverse /
</Location>
Weitere Datensätze, die könnte ich kopieren und ersetzen experimental
mit den anderen dataset-Namen. Es ist offensichtlich, dass führt zu einer Menge von code-Duplizierung/Redundanz, die sowohl eine Quelle von Fehlern und die Wartung horror.
Daher möchte ich zu etwas mehr flexibel und behandeln Sie mehrere datasets in einem solchen block. Dies sollte möglich sein, mit der LocationMatch
- Direktive.
Als angegeben dieser Kommentar und auf dieser Seite, muss ich ersetzen ProxyPass
ProxyPassMatch
, wenn Sie diesen innerhalb einer LocationMatch
block. Im wesentlichen, die docs Staat die gleiche:
Derselben treten innerhalb einer LocationMatch Abschnitt jedoch ProxyPass nicht interpretieren regexp als solche, so ist es notwendig, verwenden ProxyPassMatch in dieser situation statt.
Den LocationMatch
docs erklären:
Vom 2.4.8 ab, benannte Gruppen und Rückverweise sind erfasst und geschrieben, um die Umgebung mit dem entsprechenden Namen beginnen mit "MATCH_" und im oberen Fall. Dies ermöglicht Elemente der URLs verwiesen werden, die innerhalb von Ausdrücken und Module wie mod_rewrite. Um zu verhindern, dass Verwirrung, nummeriert (Unbenannte) Rückverweise werden ignoriert. Die Verwendung von benannten Gruppen statt.
Diese information ist nur gültig, da der Apache 2.4.8, die presumeably, warum der folgende Code funktioniert nicht auf meiner 2.4.6 installation:
<LocationMatch /(?<dataset>experimental)/>
ProxyPassMatch http://localhost:3030/%{env:MATCH_DATASET}/
ProxyPassReverse /
</LocationMatch>
Auf der anderen Seite, auf dieser Seite und dass die Veröffentlichung von implizieren, dass die numerische Gruppen-index ($1
) verwendet werden kann (als Hilfe-text gilt nur als der httpd 2.4.8, meine Verdacht /hoffe ist, dass die numerische Referenz funktioniert, bevor 2.4.8 (?)
In jedem Fall, ich habe dies ausprobiert:
<LocationMatch "/(experimental)/">
ProxyPassMatch http://localhost:3030/$1/
ProxyPassReverse /
</LocationMatch>
doch laut der Protokolle, die die internen Anruf ruft http://localhost:3030/$1/
statt http://localhost:3030/experimental/
bei der Beantragung der experimental
Pfad auf dem vhost URL.
Den ProxyPassMatch
docs nur sagen:
Wenn verwendet, innen ein LocationMatch Abschnitt, das erste argument weggelassen und das regexp ermittelt sich aus der LocationMatch.
Allerdings ist der text nicht die Mühe geben ein Beispiel dafür, wie zu kombinieren LocationMatch
und ProxyPassMatch
. Was mache ich falsch?
- Nummeriert Rückverweise werden ignoriert, mit
LocationMatch
:In order to prevent confusion, numbered (unnamed) backreferences are ignored. Use named groups instead.
httpd.apache.org/docs/current/mod/core.html#locationmatch - Eigentlich ist dieser bug vielleicht mehr relevant für Ihre Frage: issues.apache.org/bugzilla/show_bug.cgi?id=50048
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den doc auch Staaten
When the URL parameter doesn't use any backreferences into the regular expression, the original URL will be appended to the URL parameter.
, das scheint in Ihrem Fall.Weiter mehr, fehlt der host in Ihrem
ProxyPassReverse
Richtlinie.Diese sollte gut funktionieren:
Habe diese arbeiten an Apache 2.4.29:
Die URL genannt, die von Apache ist zum Beispiel
Den
(?:
ist entscheidend, wenn Sie Klammern verwenden, in diesem Beispiel.