Usando ProxyHTMLURLMap para redirecionar solicitações CSS e JS

Usando ProxyHTMLURLMap para redirecionar solicitações CSS e JS

Já tenho o apache 2.4.19 instalado no meu Ubuntu 16.04 trabalhando com Tomcat. Estou tentando adicionar um aplicativo de nó e redirecionar todas as solicitações de /node parahttp://localhost:3000com ProxyPass. Meu aplicativo de nó está escutando a porta 3000, é claro.

Funciona muito bem para redirecionar minhas solicitações comohttps://myapi.com/node/foo

No entanto, tenho problemas com a documentação gerada comapidoccom o qual sirvo estaticamente em meu aplicativo de nó app.use(express.static('doc'));. Quando eu for parahttps://myapi.com/node, parece que todos os URLs como /vendor/xxx, /locales/xxxnão foram /nodeprefixados. Achei que o ProxyHTMLURLMap cuidaria disso, mas devo estar usando errado.

Aqui está meu /etc/apache2/sites-enabled/000-default.conf (retirei alguns comentários para torná-lo mais curto)

<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
Não posso usar ProxyHTMLExtended Oncomo sugerido por Andrew Schulman porque isso vai atrapalhar a saída do apidoc.js
O index.htmlgerado com apidoc.js tem esta declaração bem no final:
<script data-main="main.js" src="vendor/require.min.js"></script>
Então o main.jsfaz um monte de require
coisas que tentei substituir main.jspor node/main.jsna instrução do script mas os requisitos estão falhando...
Também notei que se eu consultarhttps://myapi/node/index.htmldiretamente, todos os arquivos parecem carregar bem. Talvez eu apenas configure o Apache para redirecionar /node para /node/index.html

Responder1

Por padrão, mod_proxy_html não reescreve links em CSS e Javascript embutidos. Para habilitar isso você deve definir ProxyHTMLExtended On. Veja odocumentos.

Isso pode resolver o seu problema, mas não afeta CSS e Javascript provenientes de outros arquivos, em vez de incluídos in-line. Se você quiser tentar consertar isso também, você precisará usar outro módulo como mod_sed ou mod_line_edit. Isso também pode funcionar para você, mas também pode ser impossível acertar completamente, já que no código (ou seja, Javascript) os URLs podem ser calculados de maneiras arbitrárias que um analisador de regex não consegue encontrar.

informação relacionada