Proxy website que usa javascript para alterar window.location?

2

Um pouco de newb quando se trata de configurar o httpd, mas aqui está minha situação:

Estou tentando fazer proxy de um aplicativo (vamos chamá-lo de catsapp ) que não tenho controle sobre o httpd.

catsapp , um aplicativo html / javascript, tem o httpd sendo executado na frente dele também. Mas eu não posso mexer com essa configuração, só posso controlar a configuração do httpd de nível superior.

Acontece que dentro do index.html de catsapp , há uma chamada javascript:

window.location="viewer.html"

Que serve para carregar a página do visualizador.

Normalmente, escrever a diretiva ProxyPass é bastante fácil e é isso que eu tenho atualmente:

ProxyPass /catsapp http://catsapp-server timeout=600
ProxyPassReverse /catsapp http://catsapp-server timeout=600

Isso não funciona no entanto. Se eu navegar para example.com/catsapp , recebo um 200 OK seguido imediatamente por 404 Not Found porque o navegador tenta carregar example.com/viewer.html em vez de example.com/catsapp/viewer.html .

Existe alguma maneira de configurar o servidor httpd raiz para que quando catsapp chamar window.location="viewer.html" resolva para example.com/catsapp/viewer.html ?

    
por FGreg 25.01.2018 / 21:16

2 respostas

2

Acho que há vários recursos que precisam ser carregados do seu aplicativo, portanto, example.com/catsapp deve procurar um subdiretório. Sem uma barra final, os navegadores veem example.com/catsapp como um recurso semelhante a um arquivo, não como um recurso semelhante a uma pasta. A seguir, o link viewer.html relativo a example.com/catsapp leva a example.com/viewer.html . No entanto, resolver viewer.html em relação a example.com/catsapp/ (observe a barra final) resolve para example.com/catsapp/viewer.html .

Sugiro redirecionar example.com/catsapp para example.com/catsapp/ (não internamente, mas via HTTP 3xx) e editar sua regra ProxyPass para incluir também a barra final. Por exemplo:

Redirect permanent /catsapp /catsapp/
ProxyPass /catsapp/ http://catsapp-server/ timeout=600
ProxyPassReverse /catsapp/ http://catsapp-server/ timeout=600
    
por 29.01.2018 / 22:13
0

Depois de mais algumas pesquisas, parece que o que eu quero fazer não é "facilmente" possível. Agora entendo que o problema é este:

  1. Solicitações do navegador example.com/catsapp
  2. O servidor raiz do httpd intercepta a solicitação e encaminha para o link
  3. catsapp-server httpd recebe solicitações e retorna index.html
  4. O servidor raiz do httpd retorna a resposta ao cliente
  5. O navegador recebe index.html
  6. O navegador altera a localização para example.com/viewer.html (porque o javascript disse a ele para)

Assim, a URL errada está sendo decidida no lado do cliente depois que o httpd está fora de cena. O que parece que eu tenho que fazer é usar algo como mod_substitute para alterar a resposta que está sendo enviada de volta ao cliente na etapa 4 para inserir meu caminho /catsapp personalizado antes de viewer.html . Soa feia e propensa a erros.

O que eu decidi fazer em vez disso parece ser um pouco mais robusto, mas ainda bastante específico para este caso de uso. Percebi que index.html existe apenas para redirecionar o cliente para viewer.html . Então, por que eu não faço isso automaticamente durante a etapa 2 acima? Eu tentei isso adicionando um RewriteRule ao servidor httpd raiz.

RewriteRule (.*/catsapp) https://%{HTTP_HOST}%{REQUEST_URI}/viewer.html [R,L]

E parece que está funcionando bem. Eu não acho que existem outras áreas do aplicativo que tentam mudar de local, como index.html , e essa solução não funcionaria em nenhum caso em que isso acontecesse ... então, esperamos que funcione .

    
por 25.01.2018 / 23:11