Encaminhamento do Apache sem redirecionar (o aplicativo não seguirá redirecionamentos)

1

Recentemente tivemos que mover / task para / public / task, e gostaria de configurar o Apache para redirecionar de acordo.

No entanto, usar o mod_rewrite, embora funcione no navegador, parece interromper os aplicativos que fazem chamadas de API para o local acima. O que acontece é que o aplicativo retorna uma página com a mensagem dizendo que a página foi movida, mas o aplicativo não segue o redirecionamento.

Portanto, há uma maneira de simplesmente encaminhar qualquer tráfego para / task para / public / task sem "redirecionar", ou seja, retornar um código de status de redirecionamento?


EDIT: Aqui está um pouco mais de informação. Eu encontrei um teste simples para esclarecer o que estou tentando consertar. Aqui está o caminho da URL que precisa ser encaminhado:

https://mydomain.com/task

Precisa ir para:

https://mydomain.com/public/task

Se eu usar o curl no domínio original, ele apenas retornará um aviso da página de redirecionamento. Se eu adicionar o sinalizador -L, que diz ao curl para seguir os redirecionamentos, ele segue o redirecionamento com êxito.

Eu suponho que algo muito semelhante está acontecendo no aplicativo (ao qual não tenho acesso) que faz chamadas para o caminho de URL / task. Como não posso modificar o aplicativo para que ele siga os redirecionamentos corretamente, estou procurando uma solução que eu possa implementar no Apache.


EDIT 2: Obrigado a todos pela sua contribuição. A sugestão de ryanm de usar a bandeira [P] na reescrita funcionou. Aqui está tudo o que eu fiz:

O Apache tem três maneiras, aparentemente, para encaminhar ou redirecionar visitantes para um URL: Alias, Proxy e Rewrite.

O alias parece ser a solução mais óbvia, pois encaminha silenciosamente o vistor para o novo local especificado. Infelizmente isso não funcionou para mim, porque os Aliases exigem a especificação do novo local no sistema de arquivos real e, com o Jboss, esse local muda a cada reimplantação / reinicialização.

Usar ProxyPass também parecia funcionar, e possivelmente poderia, mas de qualquer forma que eu configurei, o curl retornaria um resultado vazio, e não parecia que algo estivesse acontecendo. Aqui está o comando Proxy que eu usei sem sucesso:

ProxyPass /task http://localhost:8080/public/task

Finalmente, o redirecionamento (com a flag [P]) corrigiu o problema. Meu redirecionamento inicial ficou assim:

RewriteRule ^/task/(.*)$ public/task/$1 [R,L]

Com o [R], o Apache estava retornando cabeçalhos de redirecionamento para o cliente, o que funcionava bem em qualquer navegador, mas fazia com que aplicativos como o curl interrompessem uma página que dizia para redirecionar. Curl precisava do sinalizador -L para seguir o redirecionamento.

Finalmente, usando uma combinação de ProxyPass e Rewrite, consegui que funcionasse. Eu usei aquela bandeira [P] sob a sugestão de ryanm e a onda agora seguiria o redirecionamento sem ter que usar a bandeira -L. Minha diretiva final ficou assim:

RewriteRule ^/task/(.*)$ http://localhost:8080/public/task/$1 [P]

Obrigado mais uma vez a todos pela ajuda!

    
por wrangler 02.11.2012 / 15:57

3 respostas

3

Eu usei mod_alias com sucesso sem dar ao cliente um redirecionamento; isso foi de uma solicitação / URL solicitada pelo navegador / para um diretório interno / opt / myapplication.

No entanto, se essa solução não funcionar por algum motivo, você considerou um sinalizador de proxy mod_rewrite ou uma configuração de proxy ? É o mesmo servidor, mas se o alias não funcionar, o proxy pode funcionar para o host local.

    
por 02.11.2012 / 18:10
0

Não sabendo que tipo de aplicativos estão sendo executados no servidor, você pode fazer isso com um Alias . Algo como:

Alias /task /var/www/.../public/task
    
por 02.11.2012 / 16:20
0

Estou assumindo que você está em um servidor * nix de algum tipo.

Posso pensar em duas maneiras de abordar isso que podem funcionar.

1) symlink os dois diretórios. ln -s /path/to/domain/public/task /path/to/domain/task Esta não é estritamente uma resposta do Apache, mas pode ser executada mais rapidamente que uma solução Apache. Você precisará Options FollowSymLinks para a configuração do domínio.

2) Apelidos do Apache Esta é a resposta postada por chultz, então se você for com isto escolhe o dele como a solução. Ele chegou primeiro. Você precisará de mod_alias para essa.

    
por 02.11.2012 / 17:02