使用 cloudflare 的灵活 SSL 重定向循环

使用 cloudflare 的灵活 SSL 重定向循环

我正在尝试为我的网站实施 CloudFlare 提供的灵活 SSL。

这是我的 nginx 配置:

# PHP-FPM upstream; change it accordingly to your local config!
upstream php-fpm {
    server 127.0.0.1:9000;
}

server {
    listen         80;
    server_name    example.com www.example.com;
    return         301 https://$server_name$request_uri;
}

server {
    ## Listen ports
    listen 443;

    # use _ if you want to accept everything, or replace _ with domain
    server_name example.com www.example.com;

    location / {
      #proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_set_header X_FORWARDED_PROTO https;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Url-Scheme $scheme;
      proxy_redirect    off;
      proxy_max_temp_file_size 0;
    }

(...rest of config...)

但是,当我尝试连接到网站 (Wordpress) 时,出现了重定向循环 (chrome: ERR_TOO_MANY_REDIRECTS)。如何配置 nginx 来防止这种情况?

答案1

Cloudflare 的灵活 SSL意味着 cloudflare 和你的服务器之间的连接总是通过 http:

连接始终是 http

鉴于此 - 相关问题中唯一相关的服务器块是这个:

server {
   listen         80;
   server_name    example.com www.example.com;
   return         301 https://$server_name$request_uri;
}

为什么会导致重定向循环应该是显而易见的,有两种解决方案可以使用其灵活的 ssl 解决方案强制 https 连接。

使用 Cloudflare 的页面规则

如果只能通过 cloudflare 访问服务器,您可以使用 cloudflare 自己的页面规则修改域、子域或任何 URL 模式的响应:

使用 cloudflare 的页面规则

其中一个选项是强制使用 https:

始终使用 HTTPS

测试$http_x_forwarded_proto

有时您可能想要避免使用页面规则(应该很少见或仅作为过渡),对于这些情况,可以测试转发的协议并基于此进行重定向:

server {
   listen         80;
   server_name    example.com www.example.com;

   if ($http_x_forwarded_proto = "http") {
     return 301 https://$server_name$request_uri;
   }

   ... directives to generate a response
}

答案2

如果您拥有有效的 SSL 证书,这可以解决问题。[加密] 框并选择Full (strict)如图所示。 在此处输入图片描述

确实不需要更新 Nginx 的 Web 服务器配置文件。

答案3

AD7six 的回答非常好,尽管似乎有一个更简单的解决方案,不需要页面规则。我不确定这是否是自之前的答案以来新增的,但它绝对应该记录在这个问题上,特别是考虑到在撰写本文时,您只能使用 Cloudflare 获得 3 条免费页面规则。

当您为给定域启用灵活 SSL 时,您可以向下滚动Crypto选项卡并启用该Always use HTTPS选项。此选项将无缝解决重定向循环问题(详见AD7six 的回答)。

Cloudflare 的“始终使用 HTTPS”选项

已确认此选项可与 nginx 配合使用;此外,只要灵活 SSL 已启用且正常运行,就不应该有任何服务器设置无法使用此选项。

相关内容