nginx中重定向用return或rewrite返回301/302状态码实现url跳转,别名用alias指令做服务端路径映射且不改变url;二者语义不同,不可混用,需注意语法细节与权限配置。

在 Nginx 中实现静态资源的重定向与别名,核心是区分两种不同用途的指令:重定向(返回 HTTP 状态码如 301/302)用于告诉浏览器跳转到新 URL;而别名(alias)是服务端内部路径映射,不改变 URL,适合隐藏真实路径或复用目录。
用 return 或 rewrite 实现重定向
适用于把旧资源路径永久或临时跳转到新位置,比如迁移图片目录、统一访问入口等。
-
简单跳转推荐用
return:性能更高,语法更清晰。例如将所有/old-images/请求重定向到/static/images/:
location /old-images/ {
return 301 /static/images/$request_uri;
}
注意:$request_uri 包含原始查询参数,若只需路径部分可用 $uri;301 表示永久重定向,临时跳转可改用 302。
-
需正则匹配或复杂替换时用
rewrite:比如把带版本号的路径剥离后跳转:
location ~ ^/v\d+/(.*)$ {
rewrite ^/v\d+/(.*)$ /$1 permanent;
}
其中 permanent 等价于 301,redirect 对应 302;$1 是正则捕获的第一组路径。
用 alias 实现资源别名映射
当希望 URL 路径与文件系统路径不一致时使用,比如让 /api-docs/ 指向磁盘上 /var/www/docs/ 目录,但浏览器地址栏保持不变。
-
alias必须以/结尾(目标路径),且会完全替换location中的匹配部分:
location /static/ {
alias /data/web/static/;
}
此时请求 /static/js/app.js,Nginx 会实际读取 /data/web/static/js/app.js。注意:如果写成 alias /data/web/static(缺末尾斜杠),会导致路径拼接错误。
-
不能和
root混用在同一 location 中:两者语义冲突。root是“追加”路径,alias是“替换”路径。 -
别名目录需有读取权限,且建议配合
try_files防止列目录:
location /docs/ {
alias /var/www/docs/;
try_files $uri =404;
}
常见组合场景示例
现实部署中常需搭配使用。例如:把旧文档 URL 重定向到新别名路径,并启用缓存优化。
- 先重定向旧路径到新路径:
location = /legacy/manual.html {
return 301 /docs/manual.html;
}
- 再为新路径配置别名和缓存头:
location /docs/ {
alias /opt/kb/content/;
try_files $uri =404;
expires 1h;
add_header Cache-Control "public, immutable";
}
这样既完成用户可见的跳转,又保证新资源高效、安全地交付。
调试与验证要点
配置修改后务必测试,避免 404 或循环重定向:
- 用
nginx -t检查语法; - 用
curl -I查看响应状态码和Location头是否符合预期; - 对
alias路径,确认磁盘文件存在且 Nginx 进程有读取权限(尤其 SELinux 或容器环境); - 注意正则
location的优先级高于前缀匹配,必要时加^~提升匹配效率。











