答案是浏览器本地缓存了301重定向,需禁用缓存或用curl验证:F12→Network→勾选Disable cache,或执行curl -I测试Location头;清缓存不能靠“清除浏览数据”,而应访问chrome://net-internals/#hsts删除域名策略,或改用302临时重定向调试。

遇到 Nginx 配置了 301 重定向,但浏览器始终跳转到旧地址、新配置不生效,大概率不是 Nginx 没生效,而是浏览器本地缓存了上次的 301 响应。这个缓存由 HTTP 协议强制规定,浏览器会记住并自动跳转,服务端完全无法干预。
确认是不是浏览器缓存导致的
这是最关键的一步。不能只靠刷新页面或清空历史记录来验证,因为 301 缓存是独立于常规缓存的强缓存机制:
- 打开 Chrome 或 Edge,按 F12 打开开发者工具,切换到 Network(网络) 标签页
- 勾选 Disable cache(禁用缓存) 选项
- 在地址栏输入原 URL,按回车,观察响应状态码和 Location 头
- 如果禁用缓存后返回的是 200 或新地址的 301,而启用缓存时固定跳旧地址,就坐实是浏览器缓存问题
临时绕过缓存快速验证
除了禁用缓存,还可以用更轻量的方式测试真实服务端行为:
- 用 curl -I 直接请求,比如:
curl -I http://shturl.cc/bbs - 观察返回头中的
Location是否指向预期的新地址(如http://bbs.shturl.cc) - 加
-v参数可看到完整跳转链:curl -v http://shturl.cc/bbs - 注意:不要用浏览器反复试,它自带缓存逻辑,容易误导判断
清除已缓存的 301 条目
浏览器不会把 301 缓存在常规“清除浏览数据”里,需手动清理:
- Chrome/Edge:地址栏输入
chrome://net-internals/#hsts,在 Delete domain security policies 输入旧域名(如shturl.cc),点击 Delete - Firefox:地址栏输入
about:config,搜索browser.cache.disk.enable和browser.cache.memory.enable,临时设为 false 后重启;或直接访问about:networking#cache清除 - 更彻底的方法:换一个无痕窗口,或使用全新用户配置的浏览器测试
避免后续再踩坑的操作建议
调试阶段尽量不用 301,改用 302 临时重定向:
- 把配置里的
permanent改成redirect,例如:rewrite ^/bbs/(.*)$ http://bbs.shturl.cc/$1 redirect; - 等逻辑确认无误后再切回
permanent,上线前一次性切换 - 若必须用 301 调试,可在本地 hosts 文件临时绑定域名到测试服务器 IP,避开公共 DNS 缓存影响
- Nginx 端确保
nginx -t语法正确、nginx -s reload已执行,避免配置未生效却被误判为缓存问题


















