HTTP 到 HTTPS Nginx 重定向过多
Posted
技术标签:
【中文标题】HTTP 到 HTTPS Nginx 重定向过多【英文标题】:HTTP to HTTPS Nginx too many redirects 【发布时间】:2017-05-25 18:49:17 【问题描述】:我有一个在 LEMP 堆栈上运行的网站。我已经在网站上启用了 cloudflare。我正在为 https 使用 cloudflare 灵活的 SSL 证书。当我在 chrome 中打开网站时,它显示网站重定向您太多次,并且在 Firefox 中检测到服务器正在以永远不会完成的方式重定向对该地址的请求。我试图查看其他问题的答案,但似乎都没有解决问题。 nginx 配置文件:-
server
listen 80 default_server;
listen [::]:80 default_server;
server_name mydomain.com www.mydomain.com;
return 301 https://$server_name$request_uri;
server
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
location /
try_files $uri $uri/ =404;
location ~ \.php$
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
location ~ /\.ht
deny all;
如果有人能指出我做错了什么,我将不胜感激。
【问题讨论】:
我假设您使用 Cloudflare 的灵活 SSL 选项来提供 HTTPS 内容,因为您的 Nginx 配置中没有安全服务器块。看看serverfault.com/questions/653976/… 【参考方案1】:由于您使用的是 cloudflare 灵活 SSL,因此您的 nginx 配置文件将如下所示:-
server
listen 80 default_server;
listen [::]:80 default_server;
server_name mydomain.com www.mydomain.com;
if ($http_x_forwarded_proto = "http")
return 301 https://$server_name$request_uri;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
location /
try_files $uri $uri/ =404;
location ~ \.php$
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
location ~ /\.ht
deny all;
【讨论】:
如果我切换/绕过 cloudflare,则问题中提到的配置有效。假设我们有letscrypt SSL证书的场景,我们可以有一个在这两种场景下都适用的配置吗? 你终于解决了我的问题,这几天我一直在苦苦挣扎。+1 这也解决了我的问题,但现在当我运行 PageSpeed Insight 测试时,我收到错误exceeded more than 10 redirects
.. 无论如何要解决这个问题?
你拯救了我的一天。
对于那些不使用 CloudFlare 并最终在这里寻求解决方案的人(如我) - 您还需要监听端口 443,并提供 SSL 证书和私钥的路径,如下所示:ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key;
【参考方案2】:
库沙尔的推理是正确的。由于您在 Cloudflare 和您的源之间使用“灵活”SSL,因此您进入了这个重定向循环。
这并不理想,因为 Cloudflare 和您的源之间的流量不安全。最好的选择是对流量进行加密。
进入 Cloudflare 的仪表板,选择 Crypto,然后选择满足您需求的不同 SSL 选项。我正在使用 Full (strict) 因为我通过 let's encrypt 安装了证书。
我还建议使用https://nginxconfig.io/ 来生成您的配置。
来自 Cloudflare 的帮助:
为什么我的网站不能通过 HTTPS 运行?如果您最近注册了 对于 Cloudflare,您上面的证书状态显示“正在授权 证书”,HTTPS 尚不适用于您的站点,因为 Cloudflare 没有它的证书。通常配置 付费计划大约需要 15 分钟,免费计划最多需要 24 小时。 如果您在此之后没有证书,请联系支持人员。如果 上面的状态显示“Active Certificate” 还有其他几个 通过 HTTPS 访问您的网站时可能出现的常见问题。
我应该使用什么 SSL 设置?此设置控制 Cloudflare 的 服务器连接到您的源以进行 HTTPS 请求。我们推荐 如果可能,启用 Full SSL (Strict) 设置。常见用例 每个是:
关闭:访问者将无法通过 HTTPS 查看您的网站;他们会 被重定向到 HTTP。
灵活的 SSL:您无法在源上配置 HTTPS 支持,即使 使用对您的站点无效的证书。游客将 能够通过 HTTPS 访问您的站点,但连接到您的源 将通过 HTTP 进行。注意:您可能会遇到重定向循环 一些原始配置。
完整 SSL:您的源支持 HTTPS,但已安装证书 与您的域不匹配或者是自签名的。 Cloudflare 将连接 通过 HTTPS 到您的来源,但不会验证证书。
Full(严格):您的来源具有有效证书(未过期且 由受信任的 CA 或 Cloudflare Origin CA 签名)已安装。 Cloudflare 将通过 HTTPS 连接并验证每个请求的证书。
【讨论】:
【参考方案3】:我试过了
if ($http_x_forwarded_proto = "http")
return 301 https://$server_name$request_uri;
但这并不总是重定向。在浏览器中手动写入以 http:// 开头的地址,并且 nginx 未重定向。但是使用 $scheme 它甚至可以手动输入 http:// 所以(对于我的网站)总是有效的变体:
if ($scheme = "http")
return 301 https://$server_name$request_uri;
附:对不起我的英语:(
【讨论】:
我投票赞成这个答案,因为这适用于我的情况。 如果您在第一个配置中使用$host
而不是$server_name
,它可能会起作用。
为我修复了它,我使用的是 certbot,我的配置文件中有一个重定向,然后 certbot 添加了另一个。【参考方案4】:
Kushal 的答案是对的。我遇到了和你一样的问题。
我尝试了两种解决方案:
-
从Kushal获取配置
在 Cloudflare 中选择“灵活”到“完整(严格)”并保留当前配置
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review以上是关于HTTP 到 HTTPS Nginx 重定向过多的主要内容,如果未能解决你的问题,请参考以下文章
NGINX 将 http 重定向到 https,将非 www 重定向到 ww