%20del%20mismo%20servidor%20en%20Apache%202.4%3F.png)
He vistoCómo manejar correctamente las URL relativas con un proxy inverso- sin embargo, tengo grandes problemas para entender esto (y aplicarlo a mi problema), espero que alguien pueda ayudar.
Digamos que tengo Ubuntu 20.04 como sistema operativo de servidor en mi servidor example.com
.
Luego instalohttps://github.com/hartwork/jawanndennen el servidor y ejecútelo; esta aplicación se ejecuta de forma predeterminada en el puerto 8080; y puedo confirmar que se ejecuta en el servidor, ejecutando:
wget -O- http://127.0.0.1:8080
Hasta ahora, todo bien. Ahora, lo que me gustaría es que: en lugar de acceder https://example.com:8080
para acceder a esta aplicación, me gustaría acceder https://example.com/jaw
a lo que normalmente llamaría /jaw
un "subdirectorio", pero tal vez sea más exactamente una URL relativa. En otras palabras, si entiendo la terminología correctamente, https://example.com/jaw
invertiría el proxy en https://example.com:8080
.
Entonces, intenté hacer esto, dentro de la <VirtualHost *:443>
definición de mi .conf
archivo:
<Location /jaw>
Options -Multiviews -Indexes
RewriteEngine On
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
SetOutputFilter proxy-html
ProxyHTMLURLMap http://127.0.0.1:8080
</Location>
RewriteRule ^/jaw$ /jaw/ [R]
Esto funciona, en el sentido de que se carga la página de inicio de la aplicación; pero no se puede cargar una gran cantidad de recursos (.css, .js); Al abrir la consola en mi navegador, puedo ver un montón de solicitudes 404 para:
https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...
Entonces, supongo que hay algunos archivos .js o similares que simplemente quieren cargarse /static/...
-> y si se llaman desde la dirección del "puerto", se asignarán http://127.0.0.1:8080/static/...
y todo estará bien; pero ahora, ya que somos proxy:
- solicitudes del navegador
https://example.com/jaw
- Apache recibe eso, lo reenvía a
https://example.com:8080
, donde la aplicación escucha - La aplicación devuelve archivos (.js), que tienen enlaces en el formulario
/static/...
- Una vez que llegan al navegador, se interpretan como
https://example.com/static/...
- antes de usarse como solicitudes para el servidor, que luego no puede encontrarlos.
También intenté deshacerme de todo el <Location>
fragmento anterior y simplemente usarlo en el <VirtualHost *:443>
nodo:
ProxyPass /jaw/ http://127.0.0.1:6789/
ProxyPassReverse /jaw/ http://127.0.0.1:6789/
Sucede exactamente lo mismo que antes: se carga la primera página, aparentemente todos los demás recursos se refieren a /static/...
y todos son 404.
Finalmente, también me deshice de las declaraciones anteriores y usé esto:
ProxyPass /jaw/ http://127.0.0.1:8080
ProxyHTMLURLMap http://127.0.0.1:8080 /jaw
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
Esto tiene exactamente el mismo comportamiento (la primera página se carga, los recursos fallan), excepto que los recursos ahora se enumeran en la consola del navegador como:
https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...
... y fallan con el error de proxy 502. Entonces se reescribió algo, pero algo todavía no está bien.
Entonces mi pregunta es: ¿cómo puedo decirle a Apache, a proxy?tododesde la aplicación en 127.0.0.1:8080, a algo que aparece como un "subdirectorio" (¿URL relativa? ¿Aquí /jaw
)?
Editar: resulta que el error de proxy 502 se debió a:
AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js
... claramente falta una barra; entonces resultó que esto:
ProxyPass /jaw/ http://127.0.0.1:8080/
ProxyHTMLURLMap http://127.0.0.1:8080/ /jaw/
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080/
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
... realmente funciona - en su mayor parte (los /static
recursos); pero luego, hay una llamada /data
que no es manejada por esto... Así que todavía es una pregunta abierta (para mí) cómo hacer proxy "todo"
Respuesta1
Configure su servidor backend con la URL base correcta. Eso es mucho más fácil que forzar reescrituras en el proxy.
La configuración debe ser JAWANNDENN_URL_PREFIX
. Simplemente configúrelo /jaw
y todas las URL deberían generarse correctamente.
Su primer ejemplo debería funcionar, incluso sin ProxyHTMLURLMap y OutputFilter.