HTTP状态码301与302的区别

301永久重定向与302临时重定向的区别和使用场景

问题

HTTP 状态码 301 和 302 有什么区别?分别在什么场景下使用?

解答

301 永久重定向

表示资源已永久移动到新位置。浏览器会缓存这个重定向,下次直接访问新地址。

# Nginx 配置示例
server {
    listen 80;
    server_name old-domain.com;
    
    # 301 永久重定向到新域名
    return 301 https://new-domain.com$request_uri;
}

302 临时重定向

表示资源临时移动到新位置。浏览器不会缓存,每次都会先访问原地址。

# Nginx 配置示例
server {
    listen 80;
    server_name example.com;
    
    # 302 临时重定向(如维护页面)
    location /maintenance {
        return 302 /temp-page.html;
    }
}

对比表格

特性301302
含义永久重定向临时重定向
浏览器缓存会缓存不缓存
SEO 权重传递给新 URL保留在原 URL
请求方法可能变为 GET可能变为 GET

Node.js 示例

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/old-page') {
    // 301 永久重定向
    res.writeHead(301, { Location: '/new-page' });
    res.end();
  } else if (req.url === '/temp') {
    // 302 临时重定向
    res.writeHead(302, { Location: '/maintenance' });
    res.end();
  } else {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello');
  }
});

server.listen(3000);

使用场景

301 适用于:

  • 网站更换域名
  • URL 结构永久调整
  • HTTP 强制跳转 HTTPS

302 适用于:

  • 网站临时维护
  • A/B 测试
  • 登录后跳转回原页面
  • 短链接服务

关键点

  • 301 是永久重定向,浏览器会缓存;302 是临时重定向,不缓存
  • 301 会将 SEO 权重传递给新 URL,302 不会
  • 网站换域名用 301,临时跳转用 302
  • 两者都可能将 POST 请求变为 GET(如需保持方法,用 307/308)
  • 滥用 302 会影响 SEO 排名