Nginx 里最容易混淆的两个动作是:
- 重定向:告诉客户端“你去另一个地址”
- 重写:在闸口内部改 URI,再继续走内部流程
最简单、最推荐的重定向,通常用 return:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}这就像在城市总闸口挂了一个巨大路牌:
老入口 HTTP -> 一律指向 HTTPS 新入口如果是简单路径跳转,也优先考虑 return:
location = /old-docs {
return 301 /docs;
}rewrite 更像“内部改道”:
location / {
rewrite ^/u/(.*)$ /users/$1 last;
try_files $uri $uri/ =404;
}它的意思大概是:
用户请求 /u/alice
总闸口内部改成 /users/alice
然后重新按新的 URI 再选 location初学时你只要先记住这条朴素原则:
- 简单跳转,用
return - 需要基于正则改 URI,再重新走匹配流程,用
rewrite
还有一个常见误区是过度使用 if。
Nginx 的 if 不是通用编程语言里的 if。它主要处在 rewrite 模块语义里,能用 return、try_files、更清晰的 location 分流解决时,优先不用 if。