301是永久重定向,资源已永久迁移,浏览器缓存跳转、搜索引擎传递权重;302是临时重定向,仅短期跳转,不缓存、不传权重,适用于维护、A/B测试、登录跳转等场景。
这两个 flag 都用于触发 HTTP 重定向,但语义和用途完全不同:`redirect` 发送 302 临时跳转,`permanent` 发送 301 永久跳转。选错会影响 SEO、浏览器缓存和客户端行为。
适用于短期、可逆的跳转场景,浏览器不会长期缓存该跳转,搜索引擎也不会转移权重。
表示资源已永久迁移,浏览器会缓存该跳转(通常长期有效),搜索引擎会把旧 URL 的权重、排名迁移到新 URL。
两者都必须配合 rewrite 使用,且会立即终止当前 location 内后续指令(包括 return、set 等)。
rewrite ^/old(.*)$ /new$1 permanent; 或 rewrite ^/temp(.*)$ /beta$1 redirect;
return 301 或 return 302,更轻量、更安全rewrite + permanent/redirect 是“先改写 URL,再发重定向响应”;而 return 是直接响应,不经过 rewrite 匹配逻辑。
return 301 https://$host$request_uri; 更适合全站 HTTPS 强制跳转rewrite ^/(.*).html$ /$1 permanent; 适合去掉 .html 后缀的伪静态迁移