Nginx 301 redirecionar https para http

1

Eu tenho um problema estranho com um /

Estou usando o nginx e ele está funcionando corretamente com uma pequena exceção.
Eu tenho a seguinte configuração do site

    server {
listen         80;
return         301 https://$server_name$request_uri/;
server_name    sub1.sub2.domain.com;
}
    server {
 listen              443 ssl; # The ssl directive tells NGINX to decrypt
                              # the traffic
 server_name         sub1.sub2.domain.com;
 ssl_certificate     /etc/nginx/ssl/sub1.sub2.domain.com/server.crt; # This is the certificate file
 ssl_certificate_key /etc/nginx/ssl/sub1.sub2.domain.com/server.key; # This is the private key file
 location / {
            proxy_pass http://1.1.1.1:8880;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
    }
}

Eu tenho um serviço de autenticação externo executando e protegendo uma subpasta chamada segura, portanto, se uma solicitação para / secure ou / secure / for solicitada, ela será enviada para o serviço de autenticação externo. Uma vez autenticados, são redirecionados para o URL que eles solicitaram inicialmente. Se, após a autenticação, eles solicitarem / secure /, tudo funcionará perfeitamente. Se eles digitarem / secure (sem trailing /), o nginx faz um redirecionamento 301 após a autenticação e substitui os https por http, para que eles cheguem ao link e depois passar por outro redirecionamento de volta para https

Pelo que li aqui link esse é o comportamento correto, mas a solução definir / secure / e / secure como arquivos de localização separados parece não funcionar, e também não menciona nada nesse exemplo sobre a mudança de https para http. Qualquer ajuda seria muito apreciada.

    
por Drifter104 05.05.2015 / 18:30

3 respostas

1

Seu aplicativo é responsável por isso, e é necessário encaminhar o esquema atual com cabeçalhos extras, como X-Forwarded-Proto , pois você desabilitou proxy_redirect , o que significa que os redirecionamentos são deixados intactos no servidor upstream e enviados diretamente aos visitantes sem fazer nginx em relação ao contexto de localização ou ao esquema que está sendo usado no bloco de servidor atual.

Portanto, corrija-o ou use o proxy_redirect de nginx como uma maneira relevante.

    
por 05.05.2015 / 19:17
2

Você está adicionando explicitamente a barra no seu redirecionamento:

return         301 https://$server_name$request_uri/;

Isso obviamente não é o que você quer.

Portanto, não adicione uma barra final:

return         301 https://$server_name$request_uri;
    
por 05.05.2015 / 19:51
0

Então acontece que a documentação estava certa (quem sabia), eu tinha introduzido mais problemas ao tentar resolver o primeiro problema do trailing /

Consegui corrigir o problema fazendo as seguintes alterações.

return         301 https://$server_name$request_uri;

(Removendo o rastreio / para o redirecionamento http)

location = /secure {
            return  301 https://$server_name$request_uri/;
}  

Isso realiza um redirecionamento para quem não está colocando / no final da segurança antes de ir para o serviço de autenticação.

proxy_redirect http:// $scheme://;  

Isso reescreve todos os redirecionamentos HTTP do aplicativo para https

    
por 06.05.2015 / 12:06