Nginx 强制跳转 HTTPS 配置无误且使用了 Cloudflare 后出现 ERR_TOO_MANY_REDIRECTS 301 将您重定向的次数过多的解决方法

新项目初始因为用的是 Cloudflare 的 DNS 解析,下意识的开启了 CDN,在这之后才开始配置 Nginx,明明配置的没问题但是 HTTP 强制跳转 HTTPS 就是会报 ERR_TOO_MANY_REDIRECTS 301 将您重定向的次数过多的错误,百思不得其解。
后来在查询解决方案的时候试着加上了 Cloudflare 关键词,然后看到了这篇文章:一种可能导致 ERR_TOO_MANY_REDIRECTS 的原因,感觉就是这个原因,试了下果然解决了,优化下标题 SEO 希望能给更多人看到。
虽然很简单还是放下具体的操作步骤。


关于 Cloudflare 四种 SSL/TLS 模式的区别:Cloudflare 四种 SSL/TLS 加密模式的功能解析及实践


1、确定你的 Nginx 配置是没有问题的。

    # HTTP 80 端口
    server {
        listen      80;
        server_name example.com;
        root        /usr/share/nginx/html;
        index       index.html;

        # 强制跳转 HTTPS
        location / {
            return 301 https://$server_name$request_uri;
        }
    }

    # HTTPS 443 端口
    server {
        listen      443 ssl;
        server_name example.com;
        root        /usr/share/nginx/html;
        index       index.html;

        # SSL 配置
        ssl_certificate             /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key         /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers                 ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

        location / {
            # 服务所在端口
            proxy_pass http://127.0.0.1:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    }

这样的配置至少 HTTP 强制跳转 HTTPS 就已经是没有问题的了,在防火墙和安全组打开 80 和 443 端口之后不会出现重定向不到的问题。
修改完记得重启 Nginx 服务。

nginx -s reload
service nginx restart

2、Cloudflare 配置修改 SSL/TLS 为端到端加密。
原因在开头文章中已经讲的很明确了:

原因
因为在 Cloudflare 的 SSL/TLS 设置选项中,如果你选择了 Flexible ,那么所有对你的服务器的请求都是通过 HTTP 发送的,而如果服务器上已经设置了将 HTTP 重定向到 HTTPS 的话,就会发生重定向循环。


如图更改即可。

3、注意事项:
上述操作结束后,如果服务器 Nginx 配置项中一个域名同时有 HTTP 和 HTTPS 两个 server 配置内容的话,所有 HTTP 访问会无视其对应配置而改为 HTTPS 协议并遵循 HTTPS 的 server 配置内容,这会引起最大的问题就是类似 Let’s Encrypt SSL 证书申请时所采取的:在服务器某一位置生成认证文件并用 HTTP 协议访问它以完成验证这一措施失效。
也就是说,强制 HTTPS 跳转和 Let’s Encrypt SSL 证书自动续签你只能选其一。