dob
← 全部笔记

· 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 改跳转