使用cloudflare的Flexible SSL进行重定向循环


11

我正在尝试实施CloudFlare提供给我的网站的Flexible 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来防止这种情况?

Answers:


31

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
}

在我的https连接中是否会出现错误,例如在这种情况下不是所有内容都通过http传输?
Deqq 2014年

设置cloudflare / nginx的方式与此无关,html 内容将确定是否报告了此类错误。
AD7six 2014年

此答案的第一行不正确:浏览器与CloudFlare之间的连接已进行TLS加密,从CloudFlare到原始服务器的连接为http。页面规则或高级设置未正确指定加密类型可能会导致重定向循环-例如,在您确实需要灵活的情况下将其设置为完整。
蒂姆(Tim)

还有一个插件可以帮助您解决此问题:en-nz.wordpress.org/plugins/cloudflare-flexible-ssl
蒂姆

6

如果您具有有效的SSL证书,则可以解决此问题。单击[加密]框,然后选择Full (strict)图像中的。 在此处输入图片说明

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


仅当原始Web服务器具有带有有效证书链的有效SSL证书时,完全(严格)功能才有效。完全适用于任何SSL证书,包括自签名。这不是一个很好的答案。
2016年

是的,我现在看到的问题是提到弹性证书。感谢您的反馈,我将改善我的回答,我将更加具体。我们正在这里改善知识库。如果我们考虑SEO观点,则有效的SSL证书对Google而言具有最佳价值。发布后,我不后悔。
prosti

灵活/完全/严格对SEO没有影响,该设置用于连接到原始服务器。Cloudflare向请求该页面的任何人提供共享的https证书,它与原点的连接方式基本上无关紧要。
2016年

假设服务器确实具有有效的SSL证书(未指定OP,而我是通过类似的配置google来到这里的),这是一个不错的选择-请注意,也可以通过“页面规则”将其范围限定到特定的子域。
skoczen

对于具有有效SSL的我来说,这是一个非常好的答案。
菲利普(Philip)

0

AD7six的答案非常好,尽管看起来有一个更简单的解决方案,它不需要页面规则。我不确定这是否是自上次回答以来的新增功能,但是绝对应该在此问题上进行记录,尤其是考虑到在撰写本文时,Cloudflare仅获得3个免费页面规则。

当您为给定域Crypto启用了灵活SSL时,可以在选项卡上向下滚动并启用该Always use HTTPS选项。此选项将无缝解决重定向循环问题(在AD7six的答案中进行了详细说明)。

Cloudflare的“始终使用HTTPS”选项

确认此选项可与nginx一起使用;此外,如果已经启用了Flexible SSL,并且没有任何问题,则应该没有任何服务器安装程序在该选项不起作用。


如果Cloudflare的用户界面已更改(或提供了新选项),则最好编辑现有答案,而不是创建竞争性答案。
6

@ AD7six我相信这是旧UI的补充,而不是替代,这意味着旧答案应该仍然有效。因此,单独的答案比编辑原始答案更合乎逻辑,不是吗?
乍得

我不认为“您曾经必须长期这样做,但是现在有了一个按钮!” 是一个新的答案,不:)。
AD7six
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.