Nginx域名跳转实战:rewrite模块配置详解

一、Nginx rewrite模块核心机制解析

Nginx的rewrite模块通过正则表达式匹配和规则重写实现URL路径的灵活转换,其工作原理基于PCRE(Perl兼容正则表达式)库,支持条件判断和变量操作。在域名跳转场景中,rewrite模块可实现HTTP到HTTPS的强制跳转、旧域名到新域名的无缝迁移,以及多级子域名的统一管理。

1.1 rewrite指令语法结构

  1. rewrite [flag] regex replacement;
  • flag参数:控制重写后的处理方式,常用值包括:

    • last:终止当前server块处理,重启新一轮匹配(推荐用于域名跳转)
    • break:立即停止rewrite处理
    • redirect:返回302临时重定向
    • permanent:返回301永久重定向
  • regex部分:支持PCRE正则语法,如^https?://(old\.example\.com)/(.*)可匹配旧域名的所有路径

  • replacement部分:可使用Nginx变量(如$host$request_uri)构建新URL

1.2 变量系统深度应用

Nginx提供超过50个内置变量,域名跳转中常用变量包括:

  • $host:请求头中的Host字段
  • $http_host:原始请求的Host(包含端口)
  • $scheme:协议类型(http/https)
  • $server_name:当前server块配置的域名

示例:将所有非HTTPS请求重定向到HTTPS

  1. server {
  2. listen 80;
  3. server_name example.com;
  4. rewrite ^(.*)$ https://$host$1 permanent;
  5. }

二、典型域名跳转场景实现

2.1 永久域名迁移(301重定向)

当企业更换主域名时,需确保SEO权重完整转移:

  1. server {
  2. listen 80;
  3. server_name old-domain.com www.old-domain.com;
  4. return 301 https://new-domain.com$request_uri;
  5. }

优化建议

  • 同时捕获www和非www变体
  • 保持路径参数($request_uri)完整传递
  • 使用return指令替代rewrite提升性能(当无需正则匹配时)

2.2 多级子域名统一管理

将分散的子域名集中到主域名路径下:

  1. server {
  2. listen 80;
  3. server_name ~^(?<subdomain>.+)\.example\.com$;
  4. rewrite ^/(.*)$ https://example.com/$subdomain/$1 permanent;
  5. }

技术要点

  • 使用命名捕获组(?<subdomain>)提取子域名
  • 通过变量构建新路径结构
  • 适用于SaaS平台的多租户场景

2.3 协议强制升级(HTTP到HTTPS)

现代Web应用的标准安全配置:

  1. server {
  2. listen 80 default_server;
  3. server_name _;
  4. return 301 https://$host$request_uri;
  5. }

安全增强

  • 配置HSTS头(需在HTTPS server块中)
    1. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

三、性能优化与安全防护

3.1 正则表达式性能调优

  • 优先使用前缀匹配(^开头)
  • 避免过度复杂的正则结构
  • 对高频访问域名使用if+return组合替代rewrite

3.2 防重定向循环攻击

配置时需确保:

  1. 明确终止条件(如检测到已使用HTTPS时不再跳转)
  2. 限制重定向次数(通过max_redirects参数)
  3. 避免相互跳转(A→B→A)

示例:安全跳转逻辑

  1. server {
  2. listen 80;
  3. server_name example.com;
  4. # 仅当非HTTPS时跳转
  5. if ($scheme != "https") {
  6. return 301 https://$host$request_uri;
  7. }
  8. # 其他配置...
  9. }

3.3 日志监控与调试

启用rewrite模块专用日志:

  1. rewrite_log on;
  2. error_log /var/log/nginx/rewrite.log notice;

日志分析要点

  • 记录原始请求URL与重写后URL
  • 标记301/302响应状态
  • 监控重定向循环异常

四、进阶应用场景

4.1 基于地理信息的跳转

结合GeoIP模块实现区域化跳转:

  1. geo $country {
  2. default us;
  3. CN cn;
  4. JP jp;
  5. }
  6. server {
  7. listen 80;
  8. server_name global.example.com;
  9. if ($country = cn) {
  10. rewrite ^(.*)$ https://cn.example.com$1 permanent;
  11. }
  12. if ($country = jp) {
  13. rewrite ^(.*)$ https://jp.example.com$1 permanent;
  14. }
  15. }

4.2 旧系统路径兼容

为遗留系统保留旧URL结构:

  1. location /old-system {
  2. rewrite ^/old-system/(.*)$ /new-system/legacy/$1 break;
  3. proxy_pass http://backend;
  4. }

4.3 防爬虫跳转策略

对可疑User-Agent实施验证跳转:

  1. map $http_user_agent $redirect_url {
  2. default "";
  3. ~*(bot|crawler|spider) "/verify.html";
  4. }
  5. server {
  6. if ($redirect_url) {
  7. rewrite ^(.*)$ $redirect_url permanent;
  8. }
  9. }

五、最佳实践总结

  1. 优先级原则:更精确的server_name应放在配置文件前列
  2. 性能考量:简单跳转优先使用return,复杂逻辑使用rewrite
  3. 安全基线
    • 所有跳转应明确指定协议(http/https)
    • 避免暴露内部路径结构
    • 定期审计重定向规则
  4. 维护建议
    • 使用注释说明每条规则的用途
    • 将跳转规则按业务分类存放
    • 建立跳转规则变更的审批流程

通过系统掌握Nginx rewrite模块的域名跳转技术,开发者可以高效实现网站迁移、安全升级和用户体验优化等核心需求。实际配置时建议先在测试环境验证规则,再通过nginx -t检查语法,最后逐步加载到生产环境。