在 nginx 中配合 rewrite 实现旧域名迁移,核心做法是在 server 块中利用 server_name 精准匹配旧域名,随后使用 return 301 指令将请求永久重定向至新域名。这样做能确保搜索引擎和浏览器正确更新索引,且通过返回 301 状态码告知客户端资源已永久移动。若需保留原 url 路径并追加查询参数,只需在目标地址中使用 $request_uri 变量即可。

如何配置 server_name 以拦截特定旧域名
要实现针对特定旧域名的拦截,需在 server 块中设置 server_name 为具体的旧域名值。Nginx 会优先匹配精确的域名,因此直接列出旧域名是最稳妥的方式。当用户访问该域名时,Nginx 会进入此 server 上下文进行处理。
server {
listen 80;
server_name old.example.com;
# 重定向逻辑见下文
}上述配置中,listen 80 监听 HTTP 流量,server_name old.example.com 指定了仅处理来自 old.example.com 的请求。这种配置方式简单直接,适用于只需要迁移单一旧域名的场景。如果旧域名有多个子域名需要一并迁移,可以使用通配符或正则表达式进行匹配。
如何使用 rewrite 或 return 完成重定向
虽然题目提到了 rewrite,但在现代 Nginx 最佳实践中,推荐使用 return 指令来实现简单的域名重定向。因为 return 执行效率更高,且语义更清晰。若必须使用 rewrite,则需注意其正则匹配的行为。以下展示两种方式的对比及推荐做法。
# 推荐方式:使用 return
server {
listen 80;
server_name old.example.com;
return 301 https://new.example.com$request_uri;
}
# 备选方式:使用 rewrite (不推荐用于简单跳转)
server {
listen 80;
server_name old.example.com;
rewrite ^(.*)$ https://new.example.com$1 permanent;
}在推荐方式中,return 301 直接发送 301 状态码和新 URL。$request_uri 变量包含了原始请求的 URI 和查询字符串(例如 /path?query=1),从而实现了全路径的重定向。在备选方式中,permanent 关键字等同于 301 状态码,但 rewrite 需要进行正则表达式匹配,性能略低且配置稍显复杂。对于单纯的域名迁移,return 是更优选择。

如何处理 HTTPS 证书与混合协议迁移
在实际迁移中,旧域名可能已经配置了 SSL 证书,或者新域名强制要求 HTTPS。如果旧域名仍持有有效证书,Nginx 会在 ssl 上下文中处理重定向。此时需确保 server 块同时监听 443 端口并加载证书,然后在其中配置重定向规则,以确保加密连接下的正确跳转。
server {
listen 443 ssl;
server_name old.example.com;
ssl_certificate /etc/ssl/certs/old.pem;
ssl_certificate_key /etc/ssl/private/old.key;
return 301 https://new.example.com$request_uri;
}此配置确保了即使通过 HTTPS 访问旧域名,也能被正确重定向到新域名的 HTTPS 地址。需要注意的是,如果旧域名不再使用,应尽快撤销其 SSL 证书,以减少维护成本和安全风险。同时,新域名必须已配置好相应的 SSL 证书,否则重定向后的请求将无法建立安全连接。



















