【问题标题】:HTTP to HTTPS Nginx too many redirectsHTTP 到 HTTPS Nginx 重定向过多
【发布时间】: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;
    }
}

如果有人能指出我做错了什么,我将不胜感激。

【问题讨论】:

标签: ssl nginx https


【解决方案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 的答案是对的。我遇到了和你一样的问题。

    我尝试了两种解决方案:

    1. Kushal获取配置
    2. 在 Cloudflare 中选择“灵活”到“完整(严格)”并保留当前配置

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2011-03-29
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多