Nginx 域名跳转配置实战
项目中经常碰到域名相关的跳转需求:旧域名迁移、强制 HTTPS、统一 www 前缀……在 Nginx 里配几条规则就能搞定,比在应用层处理省事不少。下面是我自己用过的几种场景配置,附上一些经验。
永久重定向(301)
换域名或需要搜索引擎更新索引时,用 301 永久重定向最合适。
server {
listen 80;
server_name old.com;
# 永久重定向到新域名,保留路径和参数
return 301 https://new.com$request_uri;
}
$request_uri 会原样带上请求路径和查询参数,比如 /about?from=123,这样用户不会丢失原本要访问的页面。
效果:http://old.com/about → https://new.com/about
临时重定向(302)
活动页面、临时营销用临时域名,经常用 302。它告诉浏览器和搜索引擎'这是临时的',不会把权重转移过去。
server {
listen 80;
server_name promo.old.com;
return 302 https://event.new.com$request_uri;
}
强制 HTTPS 跳转
现在基本所有站点都要 HTTPS,最简单就是监听 80 端口,直接 301 跳到对应的 https 地址。
server {
listen 80;
server_name www.abc.com;
return 301 https://www.abc.com$request_uri;
}
统一 WWW 前缀
SEO 一般都要求把裸域和 www 域统一,避免重复收录。两种方向都能配。
去掉 www
server {
listen 80;
server_name www.abc.com;
return 301 https://abc.com$request_uri;
}
强制加 www
server {
listen 80;
server_name abc.com;
return 301 https://www.abc.com$request_uri;
}
路径改写
有时候新旧域名的目录结构不一样,可以用正则做路径替换。
server {
listen 80;
server_name old.com;
location /oldpath/(.*) {
return 301 https://new.com/newpath/$1;
}
}
(.*) 捕获的路径部分会通过 $1 拼接到新地址里。
效果:http://old.com/oldpath/123 → https://new.com/newpath/123
301 还是 302?
从用户体验上看,两者都会立刻跳转,几乎没有感知差异。但底层行为不一样:
- 301:浏览器会缓存这条跳转规则,下次直接访问旧地址时甚至不会发起请求;搜索引擎会把权重、索引都迁移到新域名。
- 302:浏览器一般不缓存,每次都会先请求旧地址再跳转;搜索引擎保留原地址,权重不转移。
所以总结下来很简单:换域名、统一 SEO 入口用 301;临时活动、短链用 302。
return 写法的几种变化
return 302 https://event.new.com$request_uri; 只能算最常用的写法,但不是唯一的。你有几种选择:


