Ya tengo instalado Apache 2.4.19 en mi Ubuntu 16.04 trabajando con Tomcat. Estoy intentando agregar una aplicación de nodo y redirigir todas las solicitudes de/nodo ahttp://localhost:3000con ProxyPass. Mi aplicación de nodo escucha el puerto 3000, por supuesto.
Funciona muy bien para redirigir mis solicitudes comohttps://myapi.com/node/foo
Sin embargo, tengo problemas con la documentación generada conapidocque sirvo estáticamente en mi aplicación de nodo con app.use(express.static('doc'));
. Cuando voy ahttps://myapi.com/node, parece que todas las URL como /vendor/xxx
, /locales/xxx
no tenían /node
prefijo. Pensé que ProxyHTMLURLMap se encargaría de eso, pero debo estar usándolo mal.
Aquí está mi /etc/apache2/sites-enabled/000-default.conf (he eliminado algunos comentarios para hacerlo más breve)
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Tomcat
JkMount /* worker1
# SSL Config
SSLEngine on
SSLCertificateFile /path/to/certificate
SSLCertificateKeyFile /path/to/private.key
SSLCACertificateFile /path/to/intermediate-cert
# Headers
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PULL"
# Return 200 for all OPTIONS requests
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
# Reverse Proxy to Node
# The part below was supposed to change the relative url to /node/xxx but it does not seem to work
ProxyHTMLURLMap http://localhost:3000 /node
<Location /node>
ProxyPass http://localhost:3000
ProxyPassReverse http://localhost:3000
ProxyHTMLEnable On
SetOutputFilter proxy-html
ProxyHTMLURLMap http://localhost:3000
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName myapi.com
Redirect / https://myapi.com/
</VirtualHost>
EDITAR
No puedo usarlo ProxyHTMLExtended On
como lo sugirió Andrew Schulman porque arruinará la salida de apidoc.js.
El index.html
generado con apidoc.js tiene esta declaración al final:
<script data-main="main.js" src="vendor/require.min.js"></script>
Luego main.js
hace un montón de require
Intenté reemplazar main.js
con node/main.js
en la declaración del script. pero luego los requisitos fallan...
También he notado que si consultohttps://myapi/node/index.htmldirectamente, todos los archivos parecen cargarse bien. Tal vez simplemente configure Apache para redirigir /node a /node/index.html
Respuesta1
De forma predeterminada, mod_proxy_html no reescribe enlaces en CSS y Javascript en línea. Para habilitar eso tienes que configurar ProxyHTMLExtended On
. Ver eldocumentos.
Eso puede solucionar su problema, pero no afecta a CSS y Javascript que provienen de otros archivos, en lugar de los incluidos en línea. Si también quieres intentar arreglarlos, necesitarás usar otro módulo como mod_sed o mod_line_edit. Eso también puede funcionar para usted, pero también puede ser imposible hacerlo completamente bien, ya que en el código (es decir, Javascript) las URL se pueden calcular de maneras arbitrarias que un analizador de expresiones regulares no puede encontrar.