Apache ProxyPass + RewriteRule?

Apache ProxyPass + RewriteRule?

Ich habe eine Apache-Konfiguration eingerichtet, um zu versuchen, /loginalle anderen Anfragen umzuleiten und per ProxyPass weiterzuleiten:

RewriteEngine on
RewriteCond "%{REQUEST_URI}" "^/login$"
RewriteRule "^/login$" "https://sub.example.org/$1" [L,R]

SSLProxyEngine on
ProxyRequests off
ProxyPassMatch   ^/login ! # Prevent proxy on /login
ProxyPassReverse ^/login ! # Prevent proxy on /login
ProxyPassMatch   ^/      https://sub.example.org/
ProxyPassReverse ^/      https://sub.example.org/
ProxyPreserveHost off
RequestHeader set Host sub.example.org
Header set Host alt.example.org

Die meisten Ergebnisse, die ich überprüft habe, entsprechen meinen Erwartungen:

  • alt.example.org/login leitet zu sub.example.org/login weiter.
  • alt.example.org/users zeigt den Inhalt für sub.example.org/users (ohne Weiterleitung)

...Aberhttps://alt.example.org/(leerer Pfad) ergibt einen LocationHeader mit dem Wert https://alt.example.org^/login. Wow! Was verursacht diese Weiterleitung mit ^in der Domäne und warum wird altstatt auf verwiesen sub?

Das Protokoll der Rails-Anwendung, die über Apache läuft, besagt, dass die Rails-Anwendung selbst tatsächlich aufhttps://sub.example.org/login, was sinnvoller ist, da der ProxyPass bedeutet, dass Rails nur sub.example.org und nicht alt.example.org sehen sollte. Warum gibt Apache also https://alt.example.org^/login aus?

Antwort1

...aber https://alt.example.org/(leerer Pfad) führt zu einem LocationHeader mit dem Wert https://alt.example.org^/login. Wow! Was verursacht diese Weiterleitung mit ^in der Domäne und warum wird auf alt statt auf sub verwiesen?

Die ProxyPassReverseDirektive akzeptiert keinen regulären Ausdruck als erstes Argument, und hier scheint der Konflikt aufzutreten. Und dies kann auch nicht !als zweites Argument akzeptiert werden. Die altSubdomäne würde im LocationHeader erscheinen, wenn die ProxyPassReverseDirektive nicht mit der Antwort übereinstimmt.

ProxyPassReverseSie scheinen die erste Anweisung, die sich auf bezieht , nicht zu benötigen /login, da für diese URL kein Proxy verwendet wird.

Außerdem scheinen diese ProxyPassMatchAnweisungen alles an die Wurzel von zu übermitteln https://sub.example.org/– möchten Sie nicht an den entsprechenden URL-Pfad in der Zieldomäne übermitteln? Obwohl seltsamerweise genau das in Ihren beobachteten Ergebnissen zu passieren scheint? Wenn Sie an denselben URL-Pfad übermitteln möchten, können Sie stattdessen die einfachere ProxyPassAnweisung verwenden und anstelle eines regulären Ausdrucks eine einfache Präfixübereinstimmung verwenden.

alt.example.org/loginWeiterleitungen zusub.example.org/login

Dies wird zwar nicht durch die oben von Ihnen angegebene „Umleitung“ durchgeführt, die zur Dokument-Root umleiten würde, da die $1Rückverweisfunktion leer ist, da es kein Erfassungs-Submuster in derRewriteRule Muster. Wie Sie später sagen, „leitet die Rails-App selbst tatsächlich um zu https://sub.example.org/login“.

Um also zu weiterzuleiten sub.example.org/login(was offenbar die Absicht ist), müssten Sie die Anweisung so ändern, dass sie stattdessen etwa wie folgt lautet:

RewriteRule ^/(login)$ https://sub.example.org/$1" [R,L]

Die vorhergehende RewriteCondDirektive ist hier nicht erforderlich, da sie lediglich die gleiche Prüfung wiederholt, die Sie bereits imRewriteRule Muster.

RequestHeader set Host sub.example.org

Diese Zeile ist überflüssig, da dies der Zweck der vorhergehenden ProxyPreserveHost offAnweisung ist.

Header set Host alt.example.org

Diese Zeile scheint auch redundant zu sein, da Hostes sich um einen Anforderungsheader und nicht um einen Antwortheader handelt.

ProxyPassMatch   ^/login ! # Prevent proxy on /login

Außerdem unterstützt Apache keine Zeilenendekommentare. Nur eine „Eigenart“ in der Art und Weise, wie Apache-Direktiven verarbeitet werden, verhindert, dass dieser spezielle Zeilenendekommentar Ihren Server beschädigt!

Versuchen Sie unter Berücksichtigung der oben genannten Punkte stattdessen Folgendes:

RewriteEngine on

# Externally Redirect "/login" to other domain
RewriteRule ^/(login)$ https://sub.example.org/$1" [R,L]

SSLProxyEngine on

ProxyRequests off
ProxyPreserveHost off

# Prevent proxy on /login
ProxyPass /login !

# Proxy all other URLs
ProxyPass / https://sub.example.org/
ProxyPassReverse / https://sub.example.org/

verwandte Informationen