
Ich habe eine Apache-Konfiguration eingerichtet, um zu versuchen, /login
alle 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 Location
Header mit dem Wert https://alt.example.org^/login
. Wow! Was verursacht diese Weiterleitung mit ^
in der Domäne und warum wird alt
statt 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 einemLocation
Header mit dem Werthttps://alt.example.org^/login
. Wow! Was verursacht diese Weiterleitung mit^
in der Domäne und warum wird auf alt statt auf sub verwiesen?
Die ProxyPassReverse
Direktive 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 alt
Subdomäne würde im Location
Header erscheinen, wenn die ProxyPassReverse
Direktive nicht mit der Antwort übereinstimmt.
ProxyPassReverse
Sie 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 ProxyPassMatch
Anweisungen 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 ProxyPass
Anweisung verwenden und anstelle eines regulären Ausdrucks eine einfache Präfixübereinstimmung verwenden.
alt.example.org/login
Weiterleitungen 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 $1
Rü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 RewriteCond
Direktive 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 off
Anweisung ist.
Header set Host alt.example.org
Diese Zeile scheint auch redundant zu sein, da Host
es 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/