Como redirecionar o tráfego para http

Como redirecionar o tráfego para http

Eu tenho um servidor Apache sob um proxy que pode executar HTTPS. Em vez de enviar o cabeçalho HTTPS=on, ele envia HTTP_X_FORWARDED_PROTO=https.

Quero escrever uma regra .htaccess que redirecione todas as solicitações de https para http, a menos que o URL seja/usuário/login.

O que eu descobri é em torno destas linhas (que fazem um loop infinito):

RewriteCond %{HTTP:http_x_forwarded_proto} !http
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Responder1

O problema com sua regra de redirecionamento é provavelmente que você está duplicando o prefixo “http_”. Isso não deveria ser necessário. Se você tiver um proxy reverso na frente do seu servidor (como F5 ou nginx), o cabeçalho será "X-Forwarded-Proto", ou algumas vezes "X-Forwarded_Proto". Para referenciá-los em uma regra de reescrita, use %{HTTP:Name-Of-Header} (maiúsculas e minúsculas não diferenciam maiúsculas de minúsculas).

Para uma reescrita mais robusta que funcione em todas as situações, use algo assim:

# Make sure all SSL pages for dot-com are redirected to HTTP.
RewriteCond %{SERVER_PORT} 443 [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{HTTP:X-Forwarded_Proto} https
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

Mais detalhes sobre o uso de cabeçalhos em RewriteCond são fornecidos noDocumentação mod_rewrite do Apache.

Responder2

Acho que o problema com sua condição inicial é que você tem !http em vez de !=http. Isso pode corrigir o loop infinito.

    RewriteEngine On
    RewriteCond %{HTTP:http_x_forwarded_proto} !=http
    RewriteCond %{REQUEST_URI} !^/user/login.*
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Isso deve pegar qualquer solicitação https que não seja/user/login e reescrevê-la em http. Tenho certeza de que existe uma maneira mais elegante de fazer isso. Você poderia se livrar de RewriteCond %{HTTP:http_x_forwarded_proto} !=http e provavelmente funcionaria tão bem, por exemplo, já que deve receber qualquer solicitação que não inclua /user/login e redirecioná-la para http.

informação relacionada