nginx发送301重定向到http而不是https

nginx发送301重定向到http而不是https,nginx,Nginx,在Docker容器中运行nginx 1.11.6 我有许多重定向,其形式为/old/content->/new/content 然而,nginx正在将来自https的访问者重定向到http: https://example.com/old/content->http://example.com/new/content 我有一个重定向规则,可以将所有http流量重定向回https,但这会创建一个重定向链,我正试图消除它 有没有办法强迫nginx不使用url的协议部分 以下是我的配置示例: gzip

在Docker容器中运行
nginx 1.11.6

我有许多重定向,其形式为
/old/content
->
/new/content

然而,nginx正在将来自
https
的访问者重定向到
http
https://example.com/old/content
->
http://example.com/new/content

我有一个重定向规则,可以将所有
http
流量重定向回
https
,但这会创建一个重定向链,我正试图消除它

有没有办法强迫nginx不使用url的协议部分

以下是我的配置示例:

gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types 
    text/plain text/css text/js text/javascript text/xml
    application/json application/javascript application/x-javascript
    application/xml application/xml+rss
    application/x-pdf application/pdf;

rewrite ^/(.*)/$ /$1 permanent;
proxy_intercept_errors on;
error_page 404 /404;

if ($http_x_forwarded_proto != "https") {
   rewrite ^(.*)$ https://$server_name$1 permanent;
}

location /old/content {
   rewrite ^/.* /new/content permanent;
}

location /old/content2 {
   return 301 /new/content2;
}

location /old/content3 {
   return 302 /new/content3;
}

使用
nginx:1.11.6
本地修改了您的nginx配置,这是一个工作版本:

error_page 404 /404;

server {
    listen 80;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;

    ssl on;
    ssl_certificate /tmp/ssl.pem;
    ssl_certificate_key /tmp/ssl-key.pem;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    ssl_prefer_server_ciphers on;

    proxy_intercept_errors on;

    rewrite ^/(.*)/$ /$1 permanent;

    location /old/content {
       rewrite ^/.* /new/content permanent;
    }

    location /old/content2 {
       return 301 /new/content2;
    }

    location /old/content3 {
       return 302 /new/content3;
    }
}
请注意:

  • 当您要将流量从http重定向到https时,建议使用
    return 301
    而不是
    redirect
  • 在您的用例中,建议分隔两个服务器块,一个用于http,另一个用于https