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/xxx
não foram /node
prefixados. 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 On
como sugerido por Andrew Schulman porque isso vai atrapalhar a saída do apidoc.js
O index.html
gerado 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.js
faz um monte de require
coisas que tentei substituir main.js
por node/main.js
na 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.