跳至正文
中文
立即开始

HTTP 重定向

HTTP 重定向是一种 3xx 响应,用于通知客户端请求另一个 URL,通常通过 Location 响应头指定目标地址。

文章目录(8 个章节)

HTTP 重定向的工作原理

网站、CDN 或反向代理不会返回所请求的内容,而是发送重定向响应。响应包含 3xx 状态码,HTTP 响应头中通常还有 Location 字段:

HTTP/1.1 302 Found
Location: https://example.com/new-page

客户端解析新的 URL,再发起一次单独的 HTTP 请求。服务器不会代替客户端获取目标地址的内容。因此,每次重定向都会增加一次请求、一次响应和一次网络往返。

Location 的值可以是绝对 URL,也可以是 /new-page 这样的相对引用。客户端通常会自动跟随重定向,但命令行工具和库可能需要启用相关选项或设置。

常见重定向状态码

状态码会告诉客户端资源是永久移动还是临时移动,以及是否必须保留原请求的方法和请求体。

状态码 含义 请求方法处理方式
301 / 308 永久移动 308 会保留原方法;301 可能将 POST 改为 GET
302 / 307 临时移动 307 会保留原方法;302 可能将 POST 改为 GET
303 转到其他资源 通常改用 GET 跟随重定向

并非所有 3xx 状态码都表示重定向。例如,304 Not Modified 会通知客户端使用缓存的响应,通常没有重定向目标。

通过代理处理重定向

客户端通过代理发送第一个请求,读取重定向响应,再向目标地址发送新请求。如果代理配置仍然生效,重定向后的请求通常也会使用该代理。是否跟随以及如何处理重定向,由浏览器、爬虫或 HTTP 库决定,而不是由代理本身决定。

逐请求轮换的代理可能会在不同跳转之间分配不同的出口 IP。如果重定向流程对 IP 变化敏感,可以使用粘性会话保持出口 IP 一致。同时,客户端必须通过 Cookie Jar 保存相关 Cookie,并在各次重定向之间重新发送。

安全处理重定向

  • 设置跳转次数上限。 客户端通常将上限设为 5 到 10 次,以防出现无限重定向循环。
  • 解析相对地址。 以返回重定向响应的 URL 为基准解析相对地址。
  • 遵循请求方法规则。 收到 303 后不要重新发送 POST 请求体;收到 307 和 308 时,则应保留原请求方法和请求体。
  • 保护认证信息。 重定向导致主机名发生变化时,不要直接转发 Authorization 或 Cookie。
  • 记录重定向链。 记录每个状态码和目标地址,以便发现循环、异常域名或反复发生的 HTTP 到 HTTPS 跳转。

常见问题

301 和 302 重定向有什么区别?

301 表示资源已永久移动,302 表示临时移动。客户端收到这两种状态码时,都可能将 POST 改为 GET;如果必须保留原请求的方法和请求体,应使用 308 或 307。

为什么会出现“重定向次数过多”错误?

这通常表示两个 URL 相互重定向,或网站一直拒绝会话 Cookie。HTTP 到 HTTPS 规则冲突、主机名规则冲突和过期 Cookie 都是常见原因。

代理会自动跟随 HTTP 重定向吗?

不会。是否跟随重定向由浏览器或 HTTP 库决定。代理负责传输每次请求和响应,通常不会控制重定向策略。

相关术语

查看全部术语