Todos os redirecionamentos externos ( R
flag) resultam em mod_rewrite requerendo um URL absoluto. Quando você não incluir explicitamente o esquema e o nome do host na RewriteRule
substituição , o Apache usará o protocolo, o nome do servidor e a porta atuais. O Apache (ou estritamente falando, mod_rewrite) não envia um URL relativo de volta no cabeçalho de resposta Location:
HTTP esperando que o user-agent resolva o URL.
(Não foi até junho de 2014 ( RFC 7231 ) que relativo URLs no cabeçalho Location:
tornaram-se oficialmente parte do padrão Então, particularmente se você ainda estiver no Apache 2.2, então é difícil argumentar que o Apache está fazendo algo errado aqui.
Se o Apache está enviando de volta uma URL HTTP (ao contrário de HTTPS), então parece que o Apache está retornando a resposta via HTTP, não HTTPS.
Sim, você pode "corrigir" manualmente o URL usando o mod_rewrite. No entanto, a variável REQUEST_SCHEME
do servidor provavelmente terá o mesmo "problema". Se você estiver atrás de um proxy, talvez seja necessário verificar o cabeçalho X-Forwarded-Proto
(ou similar) se ele é "http" ou "https".
Além de (condicionalmente) forçar o HTTPS na própria diretiva, você também pode forçar HTTPS na configuração do servidor com a (s) diretiva (s) ServerName
(e UseCanonicalName
). No entanto, presumo que isso não é desejável e você precisa ser flexível?
Você também pode editar o cabeçalho Location:
, antes de enviá-lo de volta ao cliente. Usando mod_headers você pode forçar uma URL relativa removendo manualmente o esquema + hostname, como sugerido em esta resposta do StackOverflow :
Header edit Location "^https?://[a-zA-Z0-9.-]+" ""
Referência adicional: