在 nginx 的 rewrite 指令中,选择永久重定向(301)需要在正则表达式和替换路径后添加 permanent 标志。该标志会强制服务器返回 http 状态码 301,并自动将响应头中的 location 设置为目标地址,浏览器收到后会更新书签并重新请求新 url。

rewrite 指令中 permanent 与 redirect 的区别是什么
两者都实现重定向,但 permanent 对应 301 状态码,表示资源已永久移动;redirect 对应 302 状态码,表示临时移动。对于 SEO 优化或 URL 规范化,应优先使用 permanent,因为它能传递权重给新 URL。

server {
listen 80;
server_name example.com;
# 永久重定向:301 Moved Permanently
rewrite ^/old-path$ /new-path permanent;
# 临时重定向:302 Found
rewrite ^/temp-path$ /new-path redirect;
}
当访问 /old-path 时,Nginx 会立即终止当前请求处理,并向客户端发送 301 状态码及 Location: /new-path 头。客户端浏览器会自动发起对 /new-path 的新请求。若使用 redirect,则返回 302 状态码,行为类似但不建议用于永久迁移。
如何验证 permanent 标志是否生效
可以通过命令行工具如 curl 检查响应头中的 Status Code 是否为 301,以及 Location 字段是否正确指向目标路径。这是确认配置无误的最直接方式。

# 执行 curl 命令查看响应头 curl -I http://example.com/old-path
预期输出如下:
HTTP/1.1 301 Moved Permanently Server: nginx/1.24.0 Date: Mon, 01 Jan 2024 00:00:00 GMT Content-Type: text/html Connection: keep-alive Location: http://example.com/new-path
如果看到 301 和正确的 Location,说明 permanent 标志已正确应用。若返回 200 或其他状态码,请检查 rewrite 规则是否被其他配置覆盖,或是否存在循环重定向。
当 rewrite 匹配多个规则时,哪个会被优先执行
Nginx 按配置文件中的书写顺序从上到下依次匹配 rewrite 规则。一旦某个规则匹配成功并执行了重定向(如使用 permanent),后续规则将不再处理。因此,应将更具体、优先级更高的规则放在前面,避免被通用规则拦截。











