简介:本文详细讲解Nginx中rewrite模块的域名跳转配置方法,涵盖基础语法、常见场景、性能优化及安全注意事项,提供可落地的配置示例和调试技巧。
在互联网业务场景中,域名跳转(URL重定向)是解决网站迁移、多域名统一、SEO优化等问题的关键技术。相较于应用层代码实现,Nginx的rewrite模块通过底层网络层处理,具有以下显著优势:
典型应用场景包括:
Nginx的rewrite规则由三部分组成:
rewrite [flag] regex replacement;
使用PCRE语法,支持捕获组:
rewrite ^/old-path/(.*)$ /new-path/$1 last;
关键特性:
^ 和 $ 分别匹配行首行尾.* 匹配任意字符(除换行符)( ) 定义捕获组,可通过$1、$2引用? 使前面的字符变为可选支持变量和反向引用:
set $backend "backend1";rewrite ^/api/(.*)$ /$backend/$1;
常用内置变量:
$host:请求主机名$request_uri:完整URI(含查询参数)$scheme:协议类型(http/https)$http_user_agent:用户代理信息| 标志 | 作用 | 典型场景 |
|---|---|---|
| last | 停止处理后续rewrite规则,用新URI重新搜索location | 内部跳转 |
| break | 停止处理后续rewrite规则,在当前location继续处理 | 避免循环 |
| redirect | 返回302临时重定向 | 测试环境 |
| permanent | 返回301永久重定向 | 生产环境迁移 |
server {listen 80;server_name example.com www.example.com;return 301 https://$host$request_uri;}
优化点:
$host保持原始域名$request_uri保留完整路径和参数
server {listen 443 ssl;server_name old-domain.com www.old-domain.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;return 301 https://new-domain.com$request_uri;}
注意事项:
server {listen 80;server_name example.com;location /download {if ($http_user_agent ~* "Mobile") {rewrite ^/download(.*)$ /mobile/download$1 permanent;}# 其他处理逻辑...}}
警告:
if指令在server块中使用需谨慎,可能引发意外行为map或多个location替代复杂条件判断Nginx按配置文件顺序匹配规则,遵循原则:
=)优先^~)次之~/~*)最后建议将高频访问的跳转规则放在前面。
典型错误示例:
rewrite ^/(.*)$ /new-$1 permanent;rewrite ^/new-(.*)$ /$1 permanent;
检测方法:
curl -I http://example.com/test# 观察是否出现多次301响应
在nginx.conf中启用rewrite日志:
http {rewrite_log on;log_format rewrite_log '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent" ''"$uri" "$args" -> "$new_uri"';access_log /var/log/nginx/rewrite.log rewrite_log;}
正则表达式注入防护:
# 错误示例:直接拼接用户输入rewrite ^/user/(.*)$ /profile?id=$1;# 正确做法:限制字符集rewrite ^/user/([a-zA-Z0-9]+)$ /profile?id=$1;
开放重定向漏洞防范:
# 危险示例:允许外部控制跳转目标if ($arg_url) {rewrite ^ /redirect?to=$arg_url;}# 安全方案:白名单验证map $arg_url $safe_url {default "";"~^https://trusted\.com" $arg_url;}
HTTPS混合内容警告:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
结合GeoIP模块:
geo $country {default us;CN cn;JP jp;}server {listen 80;server_name example.com;if ($country = cn) {rewrite ^(.*)$ https://cn.example.com$1 permanent;}}
map $cookie_abtest $backend {default backend_a;"group_b" backend_b;}server {listen 80;location / {if ($cookie_abtest = "") {set $abgroup "group_${random_int % 2}";add_header Set-Cookie "abtest=$abgroup; Path=/";rewrite ^ / redirect;}proxy_pass http://$backend;}}
跳转后丢失查询参数:
# 错误示例rewrite ^/old /new permanent;# 正确写法rewrite ^/old(.*)$ /new$1 permanent;# 或使用$request_urirewrite ^/old /new$is_args$args permanent;
大小写敏感问题:
# 匹配不区分大小写rewrite ~* ^/case-insensitive(.*)$ /new$1 permanent;
正则表达式性能优化:
.*匹配过长字符串^和$锚定301与302的选择原则:
配置验证流程:
nginx -t # 语法检查nginx -s reload # 平滑重载curl -vL http://example.com/path # 跟踪跳转链
监控指标:
通过系统掌握Nginx的rewrite配置技巧,开发者可以高效实现各种复杂的域名跳转需求,同时确保系统的安全性和性能。建议在实际部署前,先在测试环境充分验证规则的正确性,并通过日志监控持续优化配置。