301重定向会被浏览器长期缓存,后续请求直接跳转新地址而不触达服务器;302则每次均需服务器响应,关闭无痕窗口后不再自动跳转。

直接在浏览器中测试 rewrite 永久重定向(301)的缓存表现,关键在于观察“首次跳转后是否绕过服务器”。因为 301 会被浏览器和中间代理长期缓存,后续请求不再触达 Nginx,所以测试必须分阶段验证。
用 curl 验证服务端真实响应
绕过浏览器缓存干扰,用命令行确认 Nginx 是否确实返回 301:
-
执行命令:
curl -I http://old-domain.com/abc - 查看响应头中是否有
HTTP/1.1 301 Moved Permanently和Location: https://new-domain.com/abc - 加
-v参数可看完整跳转过程,确认是否仅一次响应(非循环)
在无痕模式下模拟首次访问
普通窗口可能已缓存旧规则,需用干净环境测试用户首次体验:
- 打开 Chrome/Firefox 的无痕(隐私)窗口
- 输入旧 URL,按回车,观察地址栏是否立即变为新地址
- F12 打开开发者工具 → Network 标签页 → 刷新页面 → 查看该请求的 Status 是否为 301,且 Initiator 显示为 Other(非 JS 触发)
清除缓存后二次验证跳转行为
确认浏览器是否真的记住了这个 301:
- 在普通窗口中访问旧 URL → 地址栏跳转至新地址(此时可能已缓存)
- 进入浏览器设置,彻底清除“Cookie 及其他网站数据”+“缓存的图像和文件”
- 重启浏览器,再次访问旧 URL → 如果仍跳转且 Network 中看不到 301 响应(请求直接发往新地址),说明浏览器已将重定向写入本地重定向缓存(HSTS 或内部映射表)
对比 301 与 302 的实际差异
在同一配置下切换状态码,直观感受缓存区别:
- 把 Nginx 配置中的
permanent改成redirect(或return 302) - 重新加载配置:
nginx -s reload - 同样用无痕窗口访问 → 能看到 302 响应,但关闭再打开无痕窗口后,再次访问旧 URL 不会自动跳转(地址栏仍显示旧地址,需服务器响应才跳)
- 这说明 302 不被浏览器持久记忆,每次都要走服务器


















