Apache - redireciona sem alterar URL no navegador do usuário

Apache - redireciona sem alterar URL no navegador do usuário

Existe uma maneira de redirecionar com mod_rewrite sem alterar a URL no navegador do usuário?

Vi uma solução usando [P]no final de RewriteRule, mas não está funcionando para mim.

O que eu quero:

https://my-server.com/propostas/billy.joe
   < ---> internally redirect to
https://my-server.com/subdir/propostas_usuarios/billy.joe

O que eu tenho:

  <LocationMatch "/propostas/(?<username>[^/]+)">
  RewriteEngine On
  RewriteRule ^/([^/]+)(.*) /subdir/propostas_usuarios/%{env:MATCH_USERNAME}
  </LocationMatch>

Isto é o que está funcionando atualmente. Mas depois de redirecionar, posso ver /subdir/propostas_usuariosna nova URL.

Eu tentei usar [P]assim:

  RewriteRule (.*) https://%{SERVER_NAME}/hpe/propostas_usuarios/%{env:MATCH_USERNAME} [P]

Mas isso me dá estes erros:

[Fri Dec 11 16:02:57.945091 2020] [proxy:debug] [pid 16725:tid 140351293593344] mod_proxy.c(1253): [client 10.0.105.36:52700] AH01143: Running scheme https handler (attempt 0)
[Fri Dec 11 16:02:57.945102 2020] [proxy_ajp:debug] [pid 16725:tid 140351293593344] mod_proxy_ajp.c(744): [client 10.0.105.36:52700] AH00894: declining URL https://my-server.com/subdir/propostas_usuarios/billy.joe
[Fri Dec 11 16:02:57.945124 2020] [proxy_fcgi:debug] [pid 16725:tid 140351293593344] mod_proxy_fcgi.c(1032): [client 10.0.105.36:52700] AH01076: url: https://my-server.com/subdir/propostas_usuarios/billy.joe proxyname: (null) proxyport: 0
[Fri Dec 11 16:02:57.945131 2020] [proxy_fcgi:debug] [pid 16725:tid 140351293593344] mod_proxy_fcgi.c(1035): [client 10.0.105.36:52700] AH01077: declining URL https://my-server.com/subdir/propostas_usuarios/billy.joe
[Fri Dec 11 16:02:57.945149 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2338): AH00942: HTTPS: has acquired connection for (*)
[Fri Dec 11 16:02:57.945159 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2393): [client 10.0.105.36:52700] AH00944: connecting https://my-server.com/subdir/propostas_usuarios/billy.joe to my-server.com:443
[Fri Dec 11 16:02:57.946130 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2616): [client 10.0.105.36:52700] AH00947: connected /subdir/propostas_usuarios/billy.joe to my-server.com:443
[Fri Dec 11 16:02:57.946210 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(3085): AH02824: HTTPS: connection established with 10.30.6.52:443 (*)
[Fri Dec 11 16:02:57.946233 2020] [proxy:error] [pid 16725:tid 140351293593344] AH00961: HTTPS: failed to enable ssl support for 10.30.6.52:443 (my-server.com)
[Fri Dec 11 16:02:57.946236 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2353): AH00943: HTTPS: has released connection for (*)

Alguma ideia?

Responder1

O Psinalizador envia a solicitação por meio do mod_proxy - o que não parece ser necessário aqui. Você simplesmente precisa de uma reescrita interna para outro subdiretório.

<LocationMatch "/propostas/(?<username>[^/]+)">
RewriteEngine On
RewriteRule ^/([^/]+)(.*) /subdir/propostas_usuarios/%{env:MATCH_USERNAME}
</LocationMatch>

Parece que deve funcionar - não há redirecionamento externo aqui, como você parece estar observando. No entanto, não há sinalizador L(oe END) na RewriteRulediretiva, então o processamento continuará e pode ser uma diretiva posterior que aciona o redirecionamento? (Embora os redirecionamentos externos devam realmente serantesquaisquer reescritas internas.)

Se você também tiver um .htaccessarquivo (ou <Directory>contêiner), essas diretivas também serão processadas posteriormente e poderão acionar um redirecionamento. (?)

Esta regra também pode ser "simplificada" - não há necessidade do <LocationMatch>wrapper, pois tudo pode ser feito em uma única RewriteRulediretiva.

Por exemplo:

RewriteEngine On
RewriteRule ^/propostas/([^/]+)$ /subdir/propostas_usuarios/$1 [L]

Coloquei uma âncora de fim de string na regex, caso contrário ela corresponderia a uma URL no formato /propostas/billy.joe/anything. A $1é uma referência retroativa ao primeiro grupo capturado (ou seja, onome de usuário) noRewriteRule padrão.

Conforme mencionado acima, incluí o Lsinalizador para evitar que outras diretivas no contexto atual sejam processadas. No entanto, as diretivas nos <Directory>contêineres (e .htaccess) ainda serão processadas.

Se você estava vendo um redirecionamento externo anteriormente, precisará garantir que o cache do navegador tenha sido limpo antes do teste.

informação relacionada