· Nginx
Nginx 五种「跳转」,其实只有三种在改地址栏
Nginx 的 return、rewrite、proxy_pass、目录补斜杠和 error_page,哪些会改浏览器地址栏。
1. return:最干净
直接回状态码和 Location,后面的规则不再走。
return 301 https://example.com$request_uri;
return 302 /newpage;
适合固定跳转。301 永久、302 临时,别混。
2. rewrite:正则换路径
rewrite ^/old/(.*)$ /new/$1 permanent; # 301
rewrite ^/old/(.*)$ /new/$1 redirect; # 302
rewrite ^/user/(\d+)$ /profile?id=$1 permanent;
permanent 是 301,redirect 是 302。rewrite 不一定产生重定向——只有改了对外 URL 时,地址栏才会变。
3. proxy_pass:不是重定向
这是服务端内部转发。浏览器地址栏不变,用户不知道后面站着哪台机器。
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
注意:如果后端自己回了 Location,Nginx 可能再改一次 Host / 端口。排查「跳错地方」时先看这一层。
4. try_files 给目录补斜杠:隐式 301
location /notes {
try_files $uri $uri/ =404;
}
访问 /notes 时,如果它是目录,Nginx 会 301 到 /notes/。这个隐式跳转受 absolute_redirect、server_name_in_redirect、port_in_redirect 三个开关控制。配错了会丢掉端口,或者把内网端口露出去。
5. error_page:把错误码改成跳转
error_page 404 =301 /not-found;
页面不存在时不回 404,而是 301 到指定地址。能用,但别滥用,搜索引擎会把「没有」理解成「搬走了」。
对照
| 方式 | 是重定向吗 | 地址栏变吗 | 常用场景 |
|---|---|---|---|
return |
是 | 变 | 简单跳转 |
rewrite |
看情况 | 改了 URL 才变 | 正则换路径 |
proxy_pass |
不是,是代理 | 不变 | 反代后端 |
| 目录补斜杠 | 隐式 301 | 变 | 目录规范化 |
error_page |
可以 | 变 | 404 改跳转 |