Fazendo proxy de um aplicativo de "porta" no URL relativo ("subdiretório") do mesmo servidor no Apache 2.4?

Fazendo proxy de um aplicativo de "porta" no URL relativo ("subdiretório") do mesmo servidor no Apache 2.4?

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:8080para acessar esta aplicação, eu gostaria de acessar https://example.com/jaw- onde normalmente chamaria /jawde "subdiretório", mas talvez seja mais precisamente uma URL relativa. Em outras palavras, se entendi a terminologia corretamente, https://example.com/jawreverteria o proxy para https://example.com:8080.

Então, tentei fazer isso, dentro da <VirtualHost *:443>definição do meu .confarquivo:

  <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 navegadorhttps://example.com/jaw
  • O Apache recebe isso, encaminha para https://example.com:8080onde 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 /staticrecursos); mas então, há uma chamada /dataque 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 /jawe todos os URLs deverão ser gerados corretamente.

Seu primeiro exemplo deve funcionar, mesmo sem o ProxyHTMLURLMap e o OutputFilter.

informação relacionada