¿Para qué sirve la Directiva ProxyPassReverse?

8

La definición de apache.org dice:

Esta directiva permite que Apache httpd ajuste la URL en la ubicación, la ubicación del contenido y los encabezados de URI en las respuestas de redireccionamiento HTTP. Esto es esencial cuando Apache httpd se usa como proxy inverso (o puerta de enlace) para evitar omitir el proxy inverso debido a las redirecciones HTTP en los servidores de fondo que permanecen detrás del proxy inverso.

Solo se reescribirán los encabezados de respuesta HTTP específicamente mencionados anteriormente. Apache httpd no reescribirá otros encabezados de respuesta, ni por defecto reescribirá referencias URL dentro de páginas HTML. Esto significa que si el contenido proxy contiene referencias URL absolutas, omitirán el proxy. Para reescribir el contenido HTML para que coincida con el proxy, debe cargar y habilitar mod_proxy_html.

ruta es el nombre de una ruta virtual local; url es una URL parcial para el servidor remoto. Estos parámetros se usan de la misma manera que para la directiva ProxyPass.

¿Puede alguien explicarme cómo funciona? En general, ¿qué hace esta directiva?

SnowmanOnFire
fuente

Respuestas:

8

Si el servidor que realmente maneja una solicitud redirige a una URL diferente en ese servidor, la ProxyPassReversedirectiva reescribe la URL en términos del servidor proxy inverso. Por ejemplo, como se indica en la documentación de Apache , si:

 http://reverseproxy.com/mirror/foo/bar

se envía (proxy inverso) a

 http://backend.example.com/bar

para el manejo, pero en el servidor de fondo se determina que la URL correcta debería haber sido quux, es decir, que la solicitud debe ser redirigida a

 http://backend.example.com/quux

la ProxyPassReversedirectiva reescribe la URL (en el proxy inverso) a

 http://reverseproxy.com/mirror/foo/quux

antes de reenviar la respuesta de redireccionamiento HTTP al cliente. De esta manera, el cliente solo conoce el servidor proxy inverso, pero puede realizar la solicitud requerida a la URL correcta, http://reverseproxy.com/mirror/foo/quuxque luego se enviará al servidor backend y se manejará de la forma habitual. En resumen, solo permite que el proxy inverso devuelva encabezados URI correctos en las respuestas de redireccionamiento HTTP.

Potro
fuente
No está claro lo que does a redirectrealmente significa. ¿Responde con una respuesta de redireccionamiento HTTP (301/302)?
Chris Stryczynski
Responderá con algún código 3xx, ya que "[l] a clase de código de estado 3xx (Redirección) indica que el agente de usuario debe tomar medidas adicionales para cumplir con la solicitud". Ver RFC 7231 discutiendo la redirección . La ProxyPassReversedirectiva simplemente garantiza que la respuesta HTTP 3xx incluya el URI correcto en términos del servidor proxy inverso.
Potro
0

De la guía de proxy inverso Apache 2.4 :

Para garantizar eso y la ubicación: los encabezados generados desde el backend se modifican para apuntar al proxy inverso, en lugar de volver a sí mismo, la directiva ProxyPassReverse se requiere con mayor frecuencia:

ProxyPass "/" " http://www.example.com/ "

ProxyPassReverse "/" " http://www.example.com/ "

Si tiene un Cliente y 2 servidores, Proxy y Origin, donde Origin realiza el trabajo real (generando respuesta) y Proxy solo envía proxy a Origin, una buena arquitectura de servidor es cuando

  1. Origin no sabe sobre Proxy
  2. y cada solicitud pasa por Proxy.

Si Origin no sabe acerca de Proxy, es posible que Origin le devuelva al Cliente un redireccionamiento HTTP (HTTP 301 o 302) a través de Proxy, que apunta directamente a sí mismo, Origin. Y eso es un problema porque el navegador se comunicará directamente con Origin en la siguiente ronda, lo que violaría el punto 2.

A medida que las respuestas de redireccionamiento HTTP vuelven al Proxy hacia el Cliente, el Proxy puede / debe modificar esos Redireccionamientos para que la Ubicación todavía apunte a Proxy. De esta forma, una aplicación independiente que se ejecuta en Origin sin conocer el Proxy puede generar cualquier URL de redireccionamiento siempre que el Proxy esté bien configurado.

karatedog
fuente