
Troubleshooting an infinite redirect error

前言与基本情况
最近DeepSeek R1开源引起一股热潮,以至于DeepSeek官网开始限制注册。今天上午的时候发现+86手机号无法注册,内心腹诽 ”这是在限流国内,尽力给老外展示军火么“,没抱着希望,尝试用Gmail登录居然成功了。不由得感慨,看来DeepSeek最近是很忙啊。
随即充值了20CNY的DeepSeek Token,掏出最近7$买的vps,开始搭建私有化AI。
搭建过程参考的是这篇博客 ,选用的框架是Next-Chat-GPT,早在23年的时候,我就接触过这个开源项目,后来这个项目的开发者把它卖掉了,或许这就是做开源养活自己吧。
由于之前是在Vercel上部署,这次想尝试一下新的方式,于是便在VPS上用docker compose部署,参考上面的博客链接即可。
总之,设备的基本情况:域名和VPS是海外域名,域名解析是放在赛博菩萨 Cloudflare 上的(这是伏笔)
问题
在部署Nginx、配置certbot获取SSL证书、docker compose up -d
启动容器和cf添加A记录解析后,我尝试ip访问是成功的,但域名访问失败。
尝试curl域名,发现HTTP和HTTPS的回显状态码均为301:
Troubleshooting
其实症状到这里很明显了,是无限重定向导致的域名访问不正常。那么病因是什么呢?
搜索引擎给出的大部分答案是Nginx配置错误。
我的Nginx配置文件如下:
在确认配置与docker映射端口等均无误后,我想到我的博客vps没有配置certbot,但也支持HTTPS,当初部署的时候也只是通过cf做的域名解析。于是我便是怀疑,是否是cf这边配置出了问题。
打开cf dashboard,仔细阅读cf的SSL/TLS Configure encryption mode后,我弄清楚了问题的根源。
以下是cf的五种SSL/TLS Configure encryption mode,而我一开始选择的是Flexible mode
Flexible mode的通信逻辑是这样的:
- 在 Flexible 模式下,Cloudflare 只加密用户到 Cloudflare 之间的通信(HTTPS),而 Cloudflare 到源服务器之间的通信是通过 HTTP 进行的。
因此,如果VPS配置了 SSL 证书并强制 HTTPS(例如通过 .htaccess
或 Nginx/Apache 配置,这里是Nginx配置),那么VPS会要求所有请求必须通过 HTTPS 访问。
咋一听感觉没什么问题是不是?
但上面所示的Nginx配置下,会产生重定向闭环:
- 用户通过 HTTPS 访问你的网站,请求到达 Cloudflare。
- Cloudflare 以 HTTP 方式将请求转发到源服务器。
- 源服务器检测到请求是 HTTP,会强制重定向到 HTTPS(因为你在源服务器上配置了 SSL 证书)。
- 重定向后的 HTTPS 请求再次到达 Cloudflare,Cloudflare 仍然以 HTTP 方式转发到源服务器。
- 源服务器再次检测到 HTTP 请求,继续重定向到 HTTPS。
- 这个过程会无限循环,导致重定向闭环。
所以,有两种解决办法,一是将cf mode修改为Full 或 Full (Strict),二是修改Nginx配置在源服务器上禁用强制 HTTPS,根据具体需求选择适合的解决方案即可。如下图,重新curl也显示正常了,HTTPS不会301
哦对,今天是除夕,2025快乐。
- Title: Troubleshooting an infinite redirect error
- Author: Aoi Komiya
- Created at: 2025-01-28 18:07:52
- Updated at: 2025-01-28 19:10:18
- Link: https://blog.komiya.monster/2025/01/28/Troubleshooting-an-infinite-redirect-error/
- License: This work is licensed under CC BY-NC-SA 4.0.