301-vs-302-vs-307-vs-308-redirect-guide-2026.html
< BACK

301 vs 302 vs 307 vs 308:SEO 迁移的重定向代码决策矩阵

四种 HTTP 重定向代码,四种行为差异显著,还有一个在每次迁移中都出现的常见 SEO 错误:默认使用 302,因为这是框架碰巧发出的代码。这是 301 vs 302 vs 307 vs 308 的真实决策矩阵,加上选错的实际成本。

四种代码,每种一句话

301 Moved Permanently(301 永久移动):规范的永久重定向。可缓存。方法可能从 POST 改为 GET。永久 URL 移动的默认选择。

302 Found(302 已找到):临时重定向。可缓存但需要重新验证。方法可能从 POST 改为 GET。框架的默认设置;对于 SEO 永久移动几乎从不是正确的选择。

307 Temporary Redirect(307 临时重定向):类似 302 但方法被保留。POST 仍为 POST。用于临时移动且方法很重要的情况(在营销网站 SEO 中罕见;在 API 中常见)。

308 Permanent Redirect(308 永久重定向):类似 301 但方法被保留。POST 仍为 POST。当方法保留很重要时,HTTP/2 时代对 301 的替代方案。现代框架(Next.js、Vercel)默认为 redirect() 调用发出 308。

为什么这对SEO很重要

Google公开声明301和308都能完整传递PageRank信号。302和307传递的可靠性较低——Google的解释逻辑是临时重定向指向临时目标,所以规范信号应该停留在原始URL上。在迁移时,这恰恰相反:你希望规范信号移动。

现实影响:使用302而非301进行迁移重定向的网站通常在切换后前60天内会失去20-40%的有机流量。解决方法不复杂,但也不总是被发现,因为302对用户有效(浏览器跟随它们,页面加载)。Search Console在Coverage报告中以"Page with redirect"标记这个问题,但大多数团队在切换后的混乱中忽略该报告。

决策矩阵

三个问题。按顺序回答;结果决定了代码。

问题1:这个移动是永久的吗?

如果是(URL永久移动,旧URL不会返回):使用301或308。如果否(URL会返回,这是临时的):使用302或307。

问题2:该URL是否被POST请求命中?

如果是(表单提交、API调用、JSON POST):使用307或308(保留方法)。如果否(浏览器导航、链接点击):302或301都可以。

问题3:框架默认使用什么?

现代技术栈:Next.js 的 redirect() 默认发送 308,vercel.json 的 [[redirects]] 使用 308 除非设置了 permanent: false,Netlify 的 _redirects 使用 301 除非明确指定否则。Apache mod_rewrite 默认使用 302,这会第一次就捕获所有情况。在依赖框架默认值之前,始终检查你所用框架的默认行为。

四个最常见的错误

  • 默认使用 302,因为 Apache/Express/Flask 将其作为 redirect() 辅助函数的默认值。修复方法:在每个永久移动的重定向规则中明确设置 301。
  • 误认为 307 是现代版的 301。它不是——307 是现代版的 302(临时、保留方法)。对于永久移动,使用 308 或 301。
  • 在同一个重定向映射中混合使用 301 和 302。选择一种(迁移时使用 301)并在各处统一使用;混合使用代码会使 Search Console 的报告混乱。
  • 忘记 308 会保留 POST 方法。如果你的旧网址是表单提交端点,并用 308 重定向到新网址,POST 数据会流向新地址。如果你使用 301,浏览器会将 POST 转换为 GET,表单提交就会丢失。了解两者的区别可以捕捉到一类真实的错误。

实践中何时使用哪种状态码

迁移重定向(旧域名 → 新域名、旧 slug → 新 slug):使用 301。这是最简单的、最广泛支持的,Google 也明确声明这是完整的 PageRank 转移。

需要保留方法的永久移动(POST 端点、表单提交):使用 308。PageRank 转移与 301 完全相同;唯一的区别是 POST 仍然是 POST。

临时移动(A/B 测试、地理重定向、维护):使用 302。较低的 PageRank 转移是正确的行为,因为源网址应该保留其排名信号。

临时移动并保留方法的重定向(API 端点在临时故障转移下):使用 307。

如何在常见平台上设置各个状态码

Vercel (vercel.json)

[[redirects]] 块。为 308 设置 permanent: true(默认),为 307 设置 permanent: false。要强制使用 301,请显式设置 statusCode: 301。大多数现代 Vercel 部署默认使用 308,这对迁移来说足够了;对 SEO 保守的选择是使用 301 以获得与较旧爬虫和索引器的最大兼容性。

Netlify (netlify.toml 或 _redirects)

_redirects 语法:/old-url /new-url 301 用于永久重定向,/old-url /new-url 302 用于临时重定向。添加 ! 以强制状态码:/old-url /new-url 301!。

Apache (.htaccess)

Redirect 301 /old-url /new-url 用于永久重定向。RewriteRule 配合 [R=301,L] 标志用于重写式重定向。

Nginx

在 location 块内使用 return 301 https://example.com/new-url;。对于模式匹配:rewrite ^/old/(.*)$ /new/$1 permanent;(permanent 标志发出 301;redirect 标志发出 302)。

验证生产环境中的代码

每个工程师都应该牢记的三个命令。curl -I https://example.com/old-url 在响应头中返回状态码。curl -ILk 跟随重定向并沿途记录每个状态码(捕获链)。

要大规模验证数百个 URL,可以用脚本实现:一个 Node.js fetch 循环读取包含旧 URL 的 CSV 文件并记录状态和最终目标。或者使用 DataForSEO on-page Instant Pages 端点,它返回完整的重定向跟踪。

摘要

301 用于永久移动(SEO 迁移的默认值)。308 当方法保留很重要且移动是永久的。302 用于临时移动。307 用于临时移动且需要方法保留。框架默认值并不总是正确的;在部署时检查它们。

相关阅读:410 vs 404 涵盖退役情况(URL 永久消失,而非被移动)。同一次迁移通常需要两项决策。

< BACK