在 Nginx 服务器上强制 SSL 时重定向循环

在 Nginx 服务器上强制 SSL 时重定向循环

最近,我一直在尝试使用 Nginx 重定向到 HTTPS,但在尝试通过浏览器访问我的网站后,我不断遇到重定向循环。这是我的完整服务器块配置文件:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    listen 443 ssl;

    root /var/www;
    index index.php index.html index.htm home.html contact.html projects.html;

    # Make site accessible from http://localhost/
    server_name melone.co;
    return 301  https://$host$request_uri;
    ssl_certificate /path/to/ssl;
    ssl_certificate_key /path/to/ssl;


    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        proxy_set_header        X-Forwarded-Proto $scheme;
    }
    error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        root /var/www;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

}

经过一番搜索,我发现这return 301 https://$host$request_uri;是最简单的方法。

所以我将它实现到我的配置文件中,然后运行sudo service nginx restart。然后我进入浏览器,发现出现了重定向循环。一旦我删除了那一行代码,它就消失了。所以我认为我真正寻找的是一种更有效的重定向到 SSL 的方法。

任何帮助都将不胜感激。谢谢

答案1

目前,您正在将所有流量重定向到https,这对流量来说是好事http,但对https流量来说却是毫无意义的,并且会导致重定向循环。现在发生的情况如下:http-> https-> https-> https-> https-> https... 等等,直到您的浏览器告诉您“这已经足够了,我们不会成功”。

您想要实现的是将http流量重定向到https,然后处理https流量(就像您之前对http流量所做的那样)。

因此,您必须将配置分成两个server指令:一个用于http(应该执行重定向),另一个用于https,它将处理流量。

看一下这个例子:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name melone.co;
    return 301 https://$host$request_uri;
}

将此server块添加到您的配置中,删除现有块中的相应行server,然后获利!

答案2

好的,我找到了问题所在。我需要两个服务器块。一个监听端口 80 并重定向到 443。

我将其添加到我的配置文件顶部:

server {
    listen 80 ;
       server_name    melone.co;
       return         301 https://$server_name$request_uri;
}

相关内容