我正在尝试为我的网站实施 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:
鉴于此 - 相关问题中唯一相关的服务器块是这个:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
为什么会导致重定向循环应该是显而易见的,有两种解决方案可以使用其灵活的 ssl 解决方案强制 https 连接。
使用 Cloudflare 的页面规则
如果只能通过 cloudflare 访问服务器,您可以使用 cloudflare 自己的页面规则修改域、子域或任何 URL 模式的响应:
其中一个选项是强制使用 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
答案3
AD7six 的回答非常好,尽管似乎有一个更简单的解决方案,不需要页面规则。我不确定这是否是自之前的答案以来新增的,但它绝对应该记录在这个问题上,特别是考虑到在撰写本文时,您只能使用 Cloudflare 获得 3 条免费页面规则。
当您为给定域启用灵活 SSL 时,您可以向下滚动Crypto
选项卡并启用该Always use HTTPS
选项。此选项将无缝解决重定向循环问题(详见AD7six 的回答)。
已确认此选项可与 nginx 配合使用;此外,只要灵活 SSL 已启用且正常运行,就不应该有任何服务器设置无法使用此选项。