%20do%20mesmo%20servidor%20no%20Apache%202.4%3F.png)
Eu tenho vistoComo lidar corretamente com URLs relativos com um proxy reverso- no entanto, tenho grandes dificuldades para entender isso (e aplicá-lo ao meu problema), espero que alguém possa ajudar.
Digamos que eu tenha o Ubuntu 20.04 como sistema operacional de servidor no meu servidor, example.com
.
Então eu instalohttps://github.com/hartwork/jawanndennno servidor e execute-o - este aplicativo é executado por padrão na porta 8080; e posso confirmar que ele roda no próprio servidor, executando:
wget -O- http://127.0.0.1:8080
Até agora tudo bem. Agora, o que eu gostaria é que: em vez de acessar https://example.com:8080
para acessar esta aplicação, eu gostaria de acessar https://example.com/jaw
- onde normalmente chamaria /jaw
de "subdiretório", mas talvez seja mais precisamente uma URL relativa. Em outras palavras, se entendi a terminologia corretamente, https://example.com/jaw
reverteria o proxy para https://example.com:8080
.
Então, tentei fazer isso, dentro da <VirtualHost *:443>
definição do meu .conf
arquivo:
<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]
Isso funciona - no sentido de que a página inicial do aplicativo é carregada; mas muitos recursos (.css, .js) não podem ser carregados; abrindo o console no meu navegador, posso ver várias solicitações 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
...
Então, meu palpite é que existem alguns arquivos .js ou similares, que simplesmente desejam carregar /static/...
-> e se chamados a partir do endereço "porta", eles seriam mapeados http://127.0.0.1:8080/static/...
e tudo ficaria bem; mas agora, já que estamos em proxy:
- solicitações do navegador
https://example.com/jaw
- O Apache recebe isso, encaminha para
https://example.com:8080
onde o aplicativo escuta - Aplicativo envia de volta arquivos (.js), que possuem links no formato
/static/...
- Quando eles chegam de volta ao navegador, eles são interpretados como
https://example.com/static/...
- antes de serem usados como solicitações para o servidor, que então não consegue encontrá-los
Também tentei me livrar de todo o <Location>
trecho acima e apenas usar isso no <VirtualHost *:443>
nó:
ProxyPass /jaw/ http://127.0.0.1:6789/
ProxyPassReverse /jaw/ http://127.0.0.1:6789/
Acontece exatamente o mesmo que anteriormente - a primeira página é carregada, todos os outros recursos aparentemente são refletidos /static/...
e todos eles 404.
Finalmente, também me livrei das afirmações acima e usei isto:
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>
Isso tem exatamente o mesmo comportamento - carregamento da primeira página, falha nos recursos - exceto que os recursos agora estão listados no console do 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
...
... e eles falham com 502 Proxy Error. Então, alguma reescrita aconteceu, mas algo ainda não está certo.
Então, minha pergunta é: como posso dizer ao Apache, ao proxytudodo aplicativo em 127.0.0.1:8080, para algo que aparece como um "subdiretório" (URL relativo? aqui /jaw
)?
Editar: acontece que o erro de proxy 502 foi devido a:
AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js
... então claramente falta uma barra; então acabou que isso:
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 - na maior parte (os /static
recursos); mas então, há uma chamada /data
que não é tratada por isso... Então ainda é uma questão em aberto (para mim) como fazer proxy "tudo"
Responder1
Configure seu servidor back-end com o URL base correto. Isso é muito mais fácil do que forçar reescritas no proxy.
A configuração deveria ser JAWANNDENN_URL_PREFIX
. Basta configurá-lo /jaw
e todos os URLs deverão ser gerados corretamente.
Seu primeiro exemplo deve funcionar, mesmo sem o ProxyHTMLURLMap e o OutputFilter.