今天在部署新的节点的时候,遇到了一个奇怪的事情,就是配置完 Nginx 后,访问 443 端口出现莫名其妙的 301 循环。
我的 Nginx 的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| server { listen 80; server_name s2.61bts.com; location / { return 301 https://s2.61bts.com$request_uri; } } server { listen 443 ssl; server_name s2.61bts.com; ssl_certificate /etc/nginx/ssl/s2.61bts.com.fullchain.cer; ssl_certificate_key /etc/nginx/ssl/s2.61bts.com.key; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m;
location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.20.0.21:8080; } }
|
正常情况下,访问 80 端口会 301 到 443 端口去,然后就正常访问了。
但是这次,却出现了 301 循环。
检查了 Nginx 配置,防火墙等等各个地方,就是没有查出原因来。
在命令行下用 curl 访问 443 端口显示的是 301 跳转的内容,总感觉哪个地方有缓存一样。
郁闷了小半天,突然想起来了我还有CDN没有检查。由于这个服务器是在国外,为了提升国内访问速度,所以我配置了CDN。
我登陆域名管理面板,把CDN先关掉,再访问一切正常!!还真是CDN的问题。
但是是哪里的配置导致的缓存呢?
最终发现原来是回源的问题。
Cloudflare 默认的 SSL 策略是 Flexible,也就是回源的时候不使用 SSL/TLS 加密,而是直接访问 80 端口。然后CDN一般都会直接缓存 301 页面,这就导致访问 443 的时候其实是访问的缓存,进而产生循环。
既然找到了原因那就好办了,只需要设置为 Full 模式,强制回源的时候走 443 端口就可以了。
设置好以后,重新打开CDN,清掉所有缓存,再访问,一切正常!