![在 Nginx 服务器上强制 SSL 时重定向循环](https://linux22.com/image/672938/%E5%9C%A8%20Nginx%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E5%BC%BA%E5%88%B6%20SSL%20%E6%97%B6%E9%87%8D%E5%AE%9A%E5%90%91%E5%BE%AA%E7%8E%AF.png)
最近,我一直在尝试使用 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;
}