
Configuré una configuración de Apache para intentar redirigir /login
y ProxyPass todas las demás solicitudes:
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
La mayoría de los resultados que he comprobado son los esperados:
- alt.example.org/login redirige a sub.example.org/login
- alt.example.org/users muestra el contenido de sub.example.org/users (sin redirección)
...perohttps://alt.example.org/(ruta vacía) da como resultado un Location
encabezado con el valor https://alt.example.org^/login
. ¡Guau! ¿Qué causa esa redirección con ^
el dominio y por qué hace referencia alt
en lugar de sub
?
El registro de la aplicación Rails que se ejecuta sobre Apache dice que la aplicación Rails en sí está redirigiendo ahttps://sub.example.org/login, lo cual tiene más sentido porque ProxyPass significa que Rails solo debería ver sub.example.org y no alt.example.org. Entonces, ¿por qué Apache muestra https://alt.example.org^/login?
Respuesta1
...pero
https://alt.example.org/
(ruta vacía) da como resultado unLocation
encabezado con el valorhttps://alt.example.org^/login
. ¡Guau! ¿Qué está causando esa redirección con^
el dominio y por qué hace referencia a alt en lugar de sub?
La ProxyPassReverse
directiva no toma una expresión regular como primer argumento y aquí parecería que es donde está ocurriendo el conflicto. Y esto tampoco puede tomarse !
como segundo argumento. El alt
subdominio aparecería en el Location
encabezado si la ProxyPassReverse
directiva no coincidiera con la respuesta.
No parece necesitar la primera ProxyPassReverse
directiva relacionada con /login
, ya que esta URL no está siendo proxy.
Además, estas ProxyPassMatch
directivas parecen enviar todo a la raíz: https://sub.example.org/
¿no desea enviar el proxy a la ruta URL correspondiente en el dominio de destino? Aunque, curiosamente, ¿eso parece ser lo que está sucediendo en los resultados observados? Si desea utilizar el proxy a la misma ruta URL, puede usar la ProxyPass
directiva más simple y usar una coincidencia de prefijo simple en lugar de una expresión regular.
alt.example.org/login
redirige asub.example.org/login
Aunque eso no lo realiza la "redirección" que publicó en la parte superior, que redirigiría a la raíz del documento, ya que la $1
referencia inversa está vacía porque no hay un subpatrón de captura en elRewriteRule
patrón. Como indicará más adelante, "la aplicación Rails en sí está redirigiendo a https://sub.example.org/login
".
Entonces, para redirigir a sub.example.org/login
(que parece ser la intención), entonces necesitaría cambiar la directiva para que se lea algo como lo siguiente:
RewriteRule ^/(login)$ https://sub.example.org/$1" [R,L]
La directiva anterior RewriteCond
no es necesaria aquí, ya que simplemente repite la misma verificación que ya está realizando en elRewriteRule
patrón.
RequestHeader set Host sub.example.org
Esta línea es redundante, ya que ese es el objetivo de la ProxyPreserveHost off
Directiva anterior.
Header set Host alt.example.org
Esta línea también parecería redundante, ya que Host
es un encabezado de solicitud, no un encabezado de respuesta.
ProxyPassMatch ^/login ! # Prevent proxy on /login
Además, Apache no admite comentarios de final de línea. ¡Solo debido a una "peculiaridad" en la forma en que se procesan las directivas de Apache evita que este comentario de final de línea en particular rompa su servidor!
Entonces, teniendo en cuenta los puntos anteriores, intente lo siguiente:
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/