推荐使用 return 301 实现域名跳转,比 rewrite 更安全高效且利于 seo;需根据 http/https 支持情况选择单 server 块(仅 http)或双 server 块(http+https)配置,并注意 ssl 证书覆盖与跳转目标写死。

直接用 return 301 指令是最简洁、高效且推荐的做法,比 rewrite 更安全、性能更好,也更利于 SEO。
只监听 80 端口:HTTP 下统一跳转到 www
适用于旧站尚未启用 HTTPS,或新站已部署 HTTPS 但希望所有 HTTP 请求都强制走 https://www.example.com 的场景。
- 配置一个监听 80 端口的
server块,server_name同时包含根域名和带 www 的域名(如example.com www.example.com) - 用
if ($host = 'example.com')判断是否为裸域名,再跳转;或更稳妥地——直接让所有命中该块的请求都跳转(只要你不打算在example.com上提供内容) - 目标地址建议写死为
https://www.example.com$request_uri,避免因$scheme是http而跳到不安全的链接
示例:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
同时支持 HTTP 和 HTTPS:双 server 块覆盖全路径
当网站已启用 HTTPS,且希望 http://example.com、http://www.example.com、https://example.com 全部跳到 https://www.example.com 时,必须拆成两个独立 server 块。
- 第一个块监听 80 端口,把所有 HTTP 请求(无论带不带 www)301 到
https://www.example.com - 第二个块监听 443 端口,
server_name example.com(不带 www),仅做跳转,不承载业务;它需要能加载 SSL 证书(推荐通配符证书或含双域名的证书) - 第三个块才是真正的主站,监听 443,
server_name www.example.com,负责处理所有实际请求
关键点:HTTPS 下的裸域名跳转无法靠 80 端口拦截,必须单独配置 443 + example.com 的跳转块,否则用户直连 https://example.com 会看到证书错误或内容错乱。
仅处理裸域名跳转(不涉及 HTTPS 强制)
如果当前只跑 HTTP,且只需把 example.com → www.example.com(仍为 HTTP),可简化为单个 server 块:
- 新建一个
server块,server_name example.com return 301 http://www.example.com$request_uri;- 原有主站配置保留为
server_name www.example.com,正常提供服务
这种写法清晰分离职责,无 if 判断,无 rewrite,语义明确、执行快、不易出错。
验证与生效
- 修改后运行
nginx -t检查语法,确认无误再nginx -s reload重载配置 - 用
curl -I http://example.com/some/path?x=1查看响应头,确认返回301 Moved Permanently且Location值正确 - 注意浏览器缓存可能干扰测试,建议用隐身窗口或加随机参数(如
?t=123)











