一、域名跳转的核心需求与Nginx解决方案
在互联网业务中,域名跳转是常见的运维需求,典型场景包括:
- HTTP到HTTPS的安全升级(强制HTTPS)
- 旧域名到新域名的永久迁移(301重定向)
- 多域名统一入口管理(如www与非www版本合并)
- 测试环境与生产环境的流量切换
Nginx通过rewrite模块提供了强大的URL重写能力,其核心优势在于:
- 高性能:基于PCRE正则表达式引擎,处理效率远超脚本语言
- 灵活性:支持条件判断、变量捕获、标志位控制等高级功能
- 可扩展性:可与location、if等指令组合实现复杂逻辑
1.1 rewrite指令基础语法
rewrite regex replacement [flag];
regex:正则表达式匹配请求URI(不含域名部分)replacement:替换后的URI,支持$1-$9捕获组变量flag:控制重写行为的标志(break/last/redirect/permanent)
1.2 常用标志位详解
| 标志位 | 行为描述 | 典型应用场景 |
|---|---|---|
| break | 停止后续rewrite检查,继续当前location处理 | 内部路径重写 |
| last | 重新搜索匹配location,可能进入新location | 跨location的重定向 |
| redirect | 返回302临时重定向(HTTP状态码) | 测试环境跳转 |
| permanent | 返回301永久重定向(HTTP状态码) | 域名迁移 |
二、典型域名跳转场景实现
2.1 HTTP到HTTPS的强制跳转
server {listen 80;server_name example.com www.example.com;return 301 https://$host$request_uri;# 或使用rewrite实现(不推荐,return更高效)# rewrite ^ https://$host$request_uri permanent;}
优化建议:
- 优先使用
return指令,性能比rewrite高30% $host变量自动获取请求头中的Host值$request_uri包含查询参数(如?id=123)
2.2 旧域名到新域名的301迁移
server {listen 80;server_name old-domain.com;rewrite ^/(.*)$ https://new-domain.com/$1 permanent;}
注意事项:
- 301重定向会被浏览器缓存,测试时建议使用Chrome无痕模式
- 迁移后需在旧域名DNS设置TTL最小值(如300秒)
- 通过
curl -I http://old-domain.com验证HTTP头是否包含301
2.3 www与非www的统一处理
# 强制添加wwwserver {listen 80;server_name example.com;rewrite ^ https://www.example.com$request_uri permanent;}# 强制去除wwwserver {listen 80;server_name www.example.com;rewrite ^ https://example.com$request_uri permanent;}
性能优化:
- 使用
map指令预处理域名,减少正则匹配开销map $host $canonical_host {default $host;~^www\.(.+) $1;~^([^.]+)\.$ $1;}
2.4 多域名统一入口
server {listen 80;server_name example.com example.org example.net;if ($host = "example.org") {rewrite ^ https://example.com$request_uri permanent;}if ($host = "example.net") {rewrite ^ https://example.com$request_uri permanent;}# 更高效的map实现方式map $host $redirect_target {default "";example.org https://example.com;example.net https://example.com;}server {if ($redirect_target) {return 301 $redirect_target$request_uri;}}}
最佳实践:
- 避免在location块中使用if(可能产生意外行为)
- 复杂条件判断建议使用Lua脚本(通过OpenResty)
三、高级配置技巧
3.1 正则表达式性能优化
# 低效写法(包含重复匹配)rewrite ^/(user|admin)/(.*)$ /$2?role=$1 last;# 高效写法(使用非捕获组)rewrite ^/(?:user|admin)/(.*)$ /$1?role=$1 last;
优化原则:
- 优先使用
^和$锚点限定匹配范围 - 避免过度复杂的嵌套正则
- 对高频访问路径建立专用location块
3.2 变量捕获与传递
# 捕获路径中的版本号rewrite ^/v([0-9]+)/api/(.*)$ /api/$2?version=$1 last;# 传递原始请求方法(用于API网关)map $request_method $custom_header {default "";POST "X-Original-Method: POST";}
3.3 条件跳转控制
# 仅对移动端UA跳转map $http_user_agent $is_mobile {default 0;"~*android" 1;"~*iphone" 1;}server {if ($is_mobile) {rewrite ^ https://m.example.com$request_uri permanent;}}
替代方案:
- 使用
$http_user_agent变量配合正则 - 更复杂的UA检测建议使用Lua脚本
四、常见问题解决方案
4.1 无限重定向循环
问题现象:浏览器报错”ERR_TOO_MANY_REDIRECTS”
排查步骤:
- 检查rewrite规则是否形成闭环(如A→B→A)
- 验证
$host变量是否符合预期 - 使用
curl -v查看完整重定向链
修复示例:
# 错误示例(导致循环)server {server_name example.com;rewrite ^ https://example.com$request_uri permanent;}# 正确写法(添加路径检查)server {server_name example.com;if ($request_uri !~ "^/new-") {rewrite ^ https://example.com/new$request_uri permanent;}}
4.2 正则表达式不匹配
调试技巧:
- 使用
nginx -t测试配置语法 - 在location块中添加临时日志:
location / {access_log /tmp/rewrite.log;rewrite_log on;# 测试规则if ($uri ~ "^/test/(.*)") {return 200 "Matched: $1";}}
- 使用在线正则测试工具验证表达式
4.3 性能瓶颈分析
监控指标:
rewrite指令执行次数(通过stub_status模块)- 平均重定向延迟(通过Nginx Plus或第三方监控)
- 内存占用(正则表达式编译缓存)
优化建议:
- 将固定跳转规则升级为
return指令 - 对高频访问路径预编译正则表达式
- 考虑使用OpenResty的Lua脚本替代复杂rewrite
五、安全加固建议
5.1 防止开放重定向漏洞
风险场景:
- 用户可控参数直接拼接到重定向URL
- 未验证目标域名是否属于白名单
防护方案:
# 严格限制重定向域名map $arg_url $safe_redirect {default "";~*^https?://(www\.)?example\.com(/.*)?$ $arg_url;}server {if ($safe_redirect) {return 301 $safe_redirect;}}
5.2 HSTS头配置
server {listen 443 ssl;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;# 其他配置...}
5.3 日志与监控
http {log_format rewrite_log '$remote_addr - $host $request ''"$status" "$upstream_addr" ''"$request_time" "$upstream_response_time"';access_log /var/log/nginx/rewrite.log rewrite_log;}
六、总结与最佳实践
- 性能优先:简单跳转使用
return,复杂逻辑用rewrite - 安全第一:严格校验重定向目标,防止开放重定向
- 可维护性:
- 为重要跳转规则添加注释
- 使用include指令拆分配置
- 建立变更记录文档
- 监控体系:
- 跟踪301/302响应码比例
- 监控重定向延迟
- 设置异常跳转告警
推荐配置结构:
nginx.conf├── includes/│ ├── redirects-common.conf # 通用变量定义│ ├── redirects-http.conf # HTTP到HTTPS跳转│ └── redirects-domain.conf # 域名迁移规则└── conf.d/└── example.com.conf # 站点特定配置
通过系统化的rewrite配置管理,企业可以:
- 降低SEO负面影响(正确使用301/302)
- 提升用户体验(减少重定向次数)
- 增强安全性(防止URL跳转攻击)
- 简化运维(集中管理跳转规则)
建议每季度审核一次重定向规则,清理无效跳转,确保配置始终与业务需求保持同步。