状态码301和302的区别

📅 2026/7/10 21:47:24
状态码301和302的区别
状态码301和302的区别 前言在日常 Web 开发中我们经常遇到页面跳转的场景。HTTP 协议为我们提供了多种重定向状态码其中最常用的就是301和302。虽然它们都能实现页面跳转但背后的含义和使用场景却大不相同。本文将带你彻底理解这两个状态码的区别避免在实际项目中踩坑。 什么是重定向在深入讲解之前我们先来理解什么是重定向Redirect。简单来说重定向就是当浏览器请求某个 URL 时服务器告诉浏览器“你要找的资源不在这里请去另一个地方找”。浏览器收到这个指令后会自动向新的 URL 发起请求。这个过程对用户来说通常是透明的用户可能只会看到地址栏的 URL 发生了变化。 301 Moved Permanently永久重定向定义301 状态码表示请求的资源已被永久移动到了新的 URL。这是一个永久性的改变搜索引擎会更新索引将旧 URL 的权重转移到新 URL。特点✅永久性资源已经永久迁移不会再回到原地址✅缓存友好浏览器和搜索引擎会缓存这个重定向关系✅SEO 友好搜索引擎会将旧页面的排名和权重传递给新页面✅自动更新书签浏览器可能会自动更新用户的书签使用场景网站域名更换从old-domain.com迁移到new-domain.comURL 结构优化将/blog/2023/article改为/articles/2023/articleHTTP 升级到 HTTPS将所有 HTTP 请求永久重定向到 HTTPS页面永久删除或合并将多个相似页面合并为一个示例HTTP/1.1 301 Moved Permanently Location: https://www.new-domain.com/new-page代码示例Node.js// Express.js 中实现 301 重定向app.get(/old-page,(req,res){res.redirect(301,/new-page);});# Nginx 配置 301 重定向 server { listen 80; server_name old-domain.com; return 301 https://new-domain.com$request_uri; } 302 Found临时重定向定义302 状态码表示请求的资源暂时位于另一个 URL。这是一个临时性的改变原始 URL 仍然有效未来还可能恢复。⚠️ 注意在 HTTP/1.0 中称为 “Moved Temporarily”HTTP/1.1 中改为 “Found”特点⏰临时性资源只是暂时移动原地址将来还会恢复⏰不缓存浏览器和搜索引擎不会缓存这个重定向关系⏰SEO 不传递权重搜索引擎不会将旧页面的权重传递给新页面⏰保持原 URL搜索引擎会继续索引原始 URL使用场景网站维护期间临时将用户引导到维护页面A/B 测试临时将部分用户引导到测试页面地理位置重定向根据用户位置临时跳转到不同语言的页面登录重定向未登录用户访问受限页面时临时跳转到登录页促销活动临时将首页跳转到活动页面示例HTTP/1.1 302 Found Location: https://www.example.com/temporary-page代码示例Node.js// Express.js 中实现 302 重定向app.get(/limited-access,(req,res){if(!req.user){res.redirect(302,/login);}});# Nginx 配置 302 重定向 location /maintenance { return 302 https://www.example.com/maintenance-page; } 301 vs 302 核心对比对比维度301 永久重定向302 临时重定向性质永久性改变临时性改变缓存浏览器和搜索引擎会缓存不缓存每次都重新请求SEO 影响传递页面权重和排名不传递权重保留原 URL 排名搜索引擎处理更新索引为新 URL继续索引原 URL适用场景域名变更、URL 重构临时维护、A/B 测试、登录跳转可逆性不可逆理论上可随时恢复性能更好因为缓存稍差每次都需要重定向 如何选择选择 301 的情况✅ 你确定这个改变是永久的✅ 你希望保留 SEO 权重✅ 你希望浏览器缓存重定向关系以提高性能✅ 旧的 URL不再使用选择 302 的情况✅ 这个改变是临时的将来会恢复✅ 你不想影响原 URL 的 SEO 排名✅ 你需要灵活控制重定向行为✅ 这只是短期的解决方案⚠️ 常见误区与最佳实践误区 1随意使用 301❌错误做法在不确定是否永久时就直接使用 301// 不好的做法app.get(/page,(req,res){// 还没想好是不是永久改动就用了 301res.redirect(301,/new-page);});✅正确做法如果不确定先用 302确认永久后再改为 301// 更好的做法app.get(/page,(req,res){// 先用 302观察一段时间res.redirect(302,/new-page);});误区 2忽视 SEO 影响❌错误做法网站改版时全部使用 302导致 SEO 权重丢失✅正确做法永久性的 URL 变更必须使用 301确保权重传递误区 3重定向链过长❌错误做法A → B → C → D多次重定向✅正确做法直接 A → D减少重定向次数提高性能# 不好的配置 return 301 /b; # /b 又重定向到 /c/c 再重定向到 /d # 好的配置 return 301 /d; # 直接重定向到最终目标最佳实践总结谨慎使用 301一旦设置浏览器会长期缓存修改成本高测试先行在生产环境使用前先在测试环境验证监控重定向定期检查重定向是否正常工作文档记录记录所有重定向规则方便后续维护考虑用户体验重定向应该快速透明避免用户感知到延迟 实际案例分析案例 1网站 HTTPS 升级场景网站从 HTTP 升级到 HTTPS解决方案使用 301 永久重定向server { listen 80; server_name example.com www.example.com; # 所有 HTTP 请求永久重定向到 HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name example.com www.example.com; # HTTPS 正常服务 location / { proxy_pass http://backend; } }原因HTTPS 升级是永久性改变应该使用 301 让搜索引擎更新索引。案例 2用户登录拦截场景未登录用户访问个人中心时跳转到登录页解决方案使用 302 临时重定向// 中间件检查用户登录状态functionrequireLogin(req,res,next){if(!req.session.userId){// 临时重定向到登录页登录后还要返回原页面constreturnUrlencodeURIComponent(req.originalUrl);returnres.redirect(302,/login?return${returnUrl});}next();}app.get(/profile,requireLogin,(req,res){res.render(profile);});原因登录状态是临时的用户登录后还要返回原页面不适合用 301。案例 3网站域名迁移场景公司品牌升级从old-company.com迁移到new-company.com解决方案使用 301 永久重定向# 旧域名的 Nginx 配置 server { listen 80; server_name old-company.com www.old-company.com; # 永久重定向到新域名保持路径不变 return 301 https://new-company.com$request_uri; }原因域名迁移是永久性改变需要使用 301 确保 SEO 权重完全转移。 对 SEO 的影响详解301 的 SEO 影响✅权重传递搜索引擎会将旧页面的 PageRank 等权重指标传递给新页面✅索引更新搜索引擎会逐渐用新 URL 替换旧 URL✅排名保持如果操作得当可以保持原有的搜索排名⏰时间周期通常需要几周到几个月完成索引更新302 的 SEO 影响❌权重不传递搜索引擎认为这是临时变化不会传递权重❌索引不变搜索引擎继续索引原始 URL⚠️滥用风险长期使用 302 可能被搜索引擎视为操纵行为Google 官方建议如果你永久性地移动了页面请使用 301 重定向。这样可以帮助 Google 更快地更新索引并将排名信号传递到新页面。—— Google Search Central️ 如何检测重定向方法 1浏览器开发者工具打开 Chrome DevToolsF12切换到Network标签刷新页面查看请求的状态码方法 2命令行工具# 使用 curl 查看重定向curl-Ihttps://example.com/old-page# 输出示例# HTTP/2 301# location: https://example.com/new-page# 跟踪完整的重定向链curl-L-Ihttps://example.com/old-page方法 3在线工具Redirect CheckerHTTP Status Code Checker 进阶知识其他相关状态码除了 301 和 302还有其他重定向状态码状态码名称说明300Multiple Choices多个选择需要用户手动选择303See Other查看其他位置通常用于 POST 后重定向到 GET307Temporary Redirect临时重定向与 302 类似但要求保持请求方法不变308Permanent Redirect永久重定向与 301 类似但要求保持请求方法不变307 和 308 的出现原因在 HTTP/1.1 规范中302 的行为存在歧义有些浏览器会将 POST 请求重定向为 GET 请求。为了解决这个问题引入了307临时重定向必须保持原始请求方法POST 还是 POST308永久重定向必须保持原始请求方法实际应用建议对于表单提交后的重定向优先使用303或307/308对于普通的页面跳转使用301/302即可现代框架如 Express的res.redirect()默认使用 302 常见问题 FAQQ1301 重定向后可以撤销吗A技术上可以但由于浏览器会缓存 301 重定向用户可能仍然被重定向到旧地址。如果需要撤销建议清除用户浏览器缓存设置较长的缓存过期时间或者直接使用 302 代替Q2301 和 302 哪个更快A301 更快因为浏览器会缓存重定向关系后续请求可以直接跳转到新地址无需再次询问服务器。Q3可以使用 JavaScript 实现重定向吗A可以但不推荐作为主要的重定向方式// 客户端重定向不推荐作为主要方式window.location.href/new-page;原因客户端重定向不利于 SEO增加页面加载时间禁用 JavaScript 的用户无法正常工作应该优先使用服务器端重定向301/302Q4重定向会影响网站性能吗A会的。每次重定向都会增加一次 HTTP 请求导致增加页面加载时间增加服务器负载影响用户体验建议尽量减少重定向次数避免重定向链A→B→C使用 301 利用浏览器缓存 总结要点说明301永久重定向适用于永久性 URL 变更有利于 SEO302临时重定向适用于临时性跳转不影响原 URL 的 SEO选择原则永久性改变用 301临时性改变用 302SEO 考虑301 传递权重302 不传递权重性能考虑301 可缓存性能更好302 每次都要重定向最佳实践谨慎使用 301避免重定向链做好测试和监控