HTTP 重定向完全指南

目录

什么是 HTTP 重定向

HTTP 重定向(URL Redirection)是一种将用户从一个 URL 自动转移到另一个 URL 的技术。当你访问一个网址时,服务器可能会告诉你的浏览器:这个页面已经移动了,请访问新地址。

重定向在 Web 开发中非常常见,主要用于以下场景:

重定向的工作原理

当浏览器请求一个 URL 时,服务器返回一个 3xx 状态码和一个 Location 响应头,告诉浏览器新的目标地址。浏览器收到后会自动向新地址发起请求。

客户端请求:
GET /old-page HTTP/1.1
Host: example.com

服务器响应:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-page

重定向类型详解

HTTP 协议定义了多种重定向状态码,每种都有特定的用途和语义。

301 Moved Permanently - 永久重定向

301 是最常用的重定向类型,表示资源已经永久移动到新位置。

✅ 何时使用 301

  • 网站永久迁移到新域名
  • 页面 URL 永久改变
  • HTTP 永久升级到 HTTPS
  • 合并重复内容页面

SEO 影响:搜索引擎会将原 URL 的权重(PageRank)转移到新 URL,并更新索引。Google 通常需要几周时间完成权重转移。

浏览器行为:浏览器可能会缓存 301 重定向,下次访问时直接跳转到新地址,不再请求原地址。

302 Found - 临时重定向

302 表示资源临时移动到新位置,原 URL 仍然有效。

✅ 何时使用 302

  • 网站临时维护,跳转到维护页面
  • A/B 测试,临时分流用户
  • 根据地理位置临时跳转
  • 移动端和桌面端临时使用不同 URL

SEO 影响:搜索引擎会保留原 URL 的索引和权重,不会转移到新 URL。适合临时性的跳转。

浏览器行为:浏览器通常不会缓存 302 重定向,每次都会请求原地址。

303 See Other - 查看其他

303 主要用于 POST 请求后的重定向,强制浏览器使用 GET 方法访问新地址。

✅ 何时使用 303

  • 表单提交后跳转到结果页面
  • 防止表单重复提交(Post/Redirect/Get 模式)
  • API 操作完成后跳转到资源页面

典型场景:用户提交表单后,服务器处理完成,返回 303 跳转到成功页面。如果用户刷新页面,只会重新加载成功页面,不会重复提交表单。

307 Temporary Redirect - 临时重定向(保持方法)

307 与 302 类似,但严格要求浏览器保持原请求方法不变

⚠️ 307 vs 302 的区别

302 允许浏览器将 POST 请求改为 GET 请求(历史原因),而 307 严格禁止这种行为。如果原请求是 POST,重定向后仍然是 POST。

何时使用:当你需要临时重定向,且必须保持请求方法(特别是 POST 请求)时使用 307。

308 Permanent Redirect - 永久重定向(保持方法)

308 是 301 的现代替代方案,严格要求浏览器保持原请求方法不变

⚠️ 308 vs 301 的区别

301 允许浏览器将 POST 请求改为 GET 请求,而 308 严格禁止。对于 GET 请求,两者行为相同。

何时使用:当你需要永久重定向,且必须保持请求方法时使用 308。对于普通的 GET 请求,301 和 308 效果相同。

客户端重定向

除了服务器端的 HTTP 重定向,还有两种客户端重定向方式:

Meta Refresh

<meta http-equiv="refresh" content="0; url=https://example.com/new-page">

通过 HTML meta 标签实现重定向。不推荐用于 SEO,因为搜索引擎可能不会正确处理。

JavaScript 重定向

window.location.href = "https://example.com/new-page";

通过 JavaScript 实现重定向。不利于 SEO,因为搜索引擎爬虫可能不执行 JavaScript。

⚠️ 客户端重定向的问题

客户端重定向不会传递 HTTP 状态码,搜索引擎无法判断是永久还是临时重定向。应优先使用服务器端的 HTTP 重定向。

何时使用哪种重定向

网站迁移场景

内容管理场景

功能实现场景

重定向对 SEO 的影响

权重传递

301 重定向会将原页面的权重(PageRank)传递给新页面。Google 官方表示,301 重定向几乎不会损失权重(接近 100% 传递)。

302 重定向不会传递权重,搜索引擎会继续索引原 URL。如果长期使用 302,Google 可能会将其视为 301 处理。

索引更新速度

Google 通常需要几周到几个月的时间来完全处理 301 重定向:

重定向链的影响

重定向链(A → B → C)会影响 SEO 和用户体验:

🎯 最佳实践

始终使用直接重定向(A → C),避免重定向链(A → B → C)。定期检查并修复重定向链。

移动端 SEO

如果移动端和桌面端使用不同的 URL:

常见问题和解决方案

1. 重定向循环

问题:A → B → A,浏览器显示重定向次数过多错误。

常见原因:

解决方法:

# 检查重定向链路
curl -I -L https://example.com

# 查看完整的跳转过程
curl -v -L https://example.com 2>&1 | grep -E "(Location|HTTP)"

或者使用 301check.com 可视化地查看重定向链路。

2. HTTPS 重定向配置

问题:HTTP 和 HTTPS 同时可访问,导致重复内容。

解决方法(Nginx):

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://www.example.com;
}

server {
    listen 443 ssl http2;
    server_name example.com;
    return 301 https://www.example.com;
}

解决方法(Apache):

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,R=301]

3. 重定向后丢失查询参数

问题:example.com/page?id=123 重定向后变成 newsite.com/page,丢失了 ?id=123

解决方法(Nginx):

return 301 https://newsite.com;
#  包含查询参数

解决方法(Apache):

RewriteRule ^(.*)$ https://newsite.com/ [R=301,L,QSA]
# QSA = Query String Append

4. 移动端重定向问题

问题:移动端用户访问桌面版 URL,被重定向到移动版首页,而不是对应的移动版页面。

解决方法:

5. 重定向缓存问题

问题:修改了重定向配置,但浏览器仍然跳转到旧地址。

原因:浏览器缓存了 301 重定向。

解决方法:

最佳实践

1. 选择正确的重定向类型

2. 避免重定向链

3. 保持 URL 结构一致

4. 监控重定向性能

5. 文档化重定向规则

6. 测试重定向

🔧 推荐工具

  • 301check.com - 可视化重定向链路检测
  • Google Search Console - 监控索引和爬取错误
  • Screaming Frog - 批量检测网站重定向
  • curl - 命令行检测重定向

总结

HTTP 重定向是 Web 开发中的重要技术,正确使用可以改善用户体验和 SEO 表现。关键要点:

如果你需要检测网站的重定向情况,可以使用我们的 免费重定向检测工具,查看完整的跳转链路和详细信息。