Usando ProxyHTMLURLMap para redirigir solicitudes css y js

Usando ProxyHTMLURLMap para redirigir solicitudes css y js

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/xxxno tenían /nodeprefijo. 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 Oncomo lo sugirió Andrew Schulman porque arruinará la salida de apidoc.js.
El index.htmlgenerado con apidoc.js tiene esta declaración al final:
<script data-main="main.js" src="vendor/require.min.js"></script>
Luego main.jshace un montón de require
Intenté reemplazar main.jscon node/main.jsen 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.

información relacionada