301、302 和 308 怎么选?网站重定向与请求方法的区别
重定向不仅改变浏览器地址,还会影响缓存、请求方法和接口调用。选择之前,先确认变化是长期安排还是临时安排,以及请求是否包含表单或业务写入。本文适用于当前主流浏览器与支持相应状态码的 Nginx,不把页面跳转与接口迁移混为一谈。
永久与临时表达的是迁移意图
301 和 308 表达永久位置变化,302 表达临时跳转。永久状态可能被客户端或中间缓存记住,因此目标尚未稳定时,不宜先设置长久迁移再频繁改回。页面统一域名、确定长期替换旧路径时,才适合采用明确的永久安排。
临时活动入口、短时维护或需要继续保留原地址语义的场景,可以评估临时跳转。状态码的含义不等于搜索排名承诺,仍要保持新页面内容相关、可访问,并更新站内链接。MDN HTTP 重定向说明
带请求体的接口要关注方法保留
浏览器对历史使用方式的兼容,使 301、302 后的某些请求可能改变方法;308 的重要用途之一是明确保留方法与请求体。需要临时且保留方法时,还应了解 307,而不是只在三个数字中硬选。
即使状态码要求保留方法,也不能保证所有旧客户端、SDK 或调用方都自动跟随。订单、支付回调和上传接口应与调用方确认协议,不能直接把旧地址跳到新地址后宣布迁移完成。验证必须使用测试环境和可撤销的业务样本。
固定目标地址,避免把访客输入拼进域名
下面演示把自己的 HTTP 站点转到固定 HTTPS 域名,路径与查询参数随请求保留。域名需替换成实际名称,目标 HTTPS 入口应事先配置并验证:
server {
listen 80;
server_name example.com;
return 308 https://example.com$request_uri;
}
使用固定目标域名便于审查,不应无条件把未经约束的请求 Host 拼接成跳转目标。若迁移需要不同路径映射,就逐条定义对应关系,不要把所有旧文章都跳到首页。return 的语法和状态码支持可查Nginx 重写模块。
查询参数是否保留也要按用途决定。追踪参数、搜索条件和业务令牌不是同一类数据;跨域跳转尤其应避免把敏感信息带到不该接收的目标。不能为了清理地址而误删业务所需参数。
检查实际跳转链与最终内容
在本机使用实际域名观察响应,Windows PowerShell 可用 curl.exe:
curl -I http://example.com/path
curl -I -L --max-redirs 5 http://example.com/path
第一条看当前返回的状态和 Location,第二条限制跟随次数以检查链路。HEAD 请求只适合检查响应头,涉及 POST 或上传时还需要在安全测试环境验证真实方法和正文是否按预期到达。
同时检查根域名、www、HTTP、HTTPS 和典型深层页面。多层代理各自执行规范化时,可能在两个域名或两种协议之间反复跳转。出现循环,应先确认哪一层负责最终规则,避免每层各加一条补丁。
发布和回退都考虑已有缓存
修改前保存原配置,语法检查通过后重新加载,先用有限样本验收,再更新站内链接。新地址应该直接可访问,不需要每次经过旧地址多跳几次;这能减少访问往返,也让维护关系更清楚。
如果已经发布永久跳转,回退配置后部分客户端仍可能使用缓存结果,因此需要提前规划观察期和旧入口保留。目标页面出错时优先修复明确映射与目标内容,不要不断换状态码碰运气。记录每条规则的来源、目标、方法要求和撤回条件,后续迁移才能有依据。