¿Apache ProxyPass + RewriteRule?

¿Apache ProxyPass + RewriteRule?

Configuré una configuración de Apache para intentar redirigir /loginy 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 Locationencabezado con el valor https://alt.example.org^/login. ¡Guau! ¿Qué causa esa redirección con ^el dominio y por qué hace referencia alten 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 un Locationencabezado con el valor https://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 ProxyPassReversedirectiva 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 altsubdominio aparecería en el Locationencabezado si la ProxyPassReversedirectiva no coincidiera con la respuesta.

No parece necesitar la primera ProxyPassReversedirectiva relacionada con /login, ya que esta URL no está siendo proxy.

Además, estas ProxyPassMatchdirectivas 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 ProxyPassdirectiva más simple y usar una coincidencia de prefijo simple en lugar de una expresión regular.

alt.example.org/loginredirige 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 $1referencia 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 RewriteCondno 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 offDirectiva anterior.

Header set Host alt.example.org

Esta línea también parecería redundante, ya que Hostes 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/

información relacionada