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中重定向一个网址

NGINX 将 http 重定向到 https,将非 www 重定向到 ww

将 HTTP 重定向到 HTTPS(中间件重定向 vs Nginx)

使用 Nginx 将 HTTP 重定向到 HTTPS

Cloudflare 和 nginx:重定向过多

nginx 代理https到http重定向失败的问题