一、为什么需要rewrite规则?

当你在浏览器输入www.old.com/about却跳转到www.new.com/about时,当你在访问/product/123时实际读取的是/detail.php?id=123时,这都是rewrite规则在默默工作。就像快递员帮你把包裹改送到新地址,Nginx的rewrite模块就是网站世界的"地址改写专家"。

二、Nginx配置环境准备

(使用Nginx 1.18 + CentOS 7技术栈)

# 验证Nginx版本
nginx -v
# 重启服务
systemctl restart nginx
# 实时查看错误日志
tail -f /var/log/nginx/error.log

三、rewrite语法

rewrite 正则表达式 替换目标 [flag];
# 示例说明:
# ^/old/(.*)$  匹配以/old/开头的URL
# /new/$1      将匹配内容赋值给$1变量
# last         停止处理后续rewrite规则

四、六大实战场景解析

4.1 旧域名跳转新域名

server {
    listen 80;
    server_name old-domain.com;
    
    # 全站301永久跳转
    rewrite ^/(.*)$ http://new-domain.com/$1 permanent;
    
    # 带参数跳转特殊处理
    rewrite ^/search?(.*) http://new-domain.com/search?$1 permanent;
}

4.2 隐藏网站入口文件

location / {
    # 当请求不是真实文件时
    if (!-e $request_filename) {
        # 将请求路由到index.php
        rewrite ^/(.*)$ /index.php/$1 last;
    }
}

4.3 动态URL伪静态化

# 商品详情页美化
rewrite ^/product/(\d+).html$ /detail.php?id=$1? last;

# 带分类的多参数处理
rewrite ^/category/([a-z]+)/(\d+)/?$ /list.php?type=$1&page=$2? last;

4.4 多级目录扁平化

# 将/2023/08/15/post123重写为/post.php?id=123
rewrite ^/\d{4}/\d{2}/\d{2}/post(\d+)$ /post.php?id=$1 last;

4.5 强制HTTPS跳转

server {
    listen 80;
    server_name example.com;
    
    # 智能跳转方案
    if ($scheme != "https") {
        rewrite ^ https://$host$request_uri permanent;
    }
}

4.6 跨设备自动适配

map $http_user_agent $mobile {
    default 0;
    ~*android|iphone 1;
}

server {
    # 移动端跳转专用目录
    if ($mobile = 1) {
        rewrite ^/(.*)$ /mobile/$1 break;
    }
}

五、高级技巧组合拳

5.1 正则表达式性能优化

# 糟糕的写法(重复匹配)
rewrite ^/blog-(\d+)-(\d+)-(\d+)/ /blog/$1/$2/$3/;

# 优化后的版本
rewrite ^/blog-(\d{4})-(\d{2})-(\d{2})/ /blog/$1/$2/$3/;

5.2 location与rewrite的默契配合

location /downloads/ {
    # 仅处理/downloads/下的请求
    rewrite ^/downloads/(.*)\.zip$ /mirror/$1.zip permanent;
}

5.3 变量魔法

# 根据请求协议动态跳转
if ($http_x_forwarded_proto = "http") {
    rewrite ^(.*)$ https://$host$1 permanent;
}

六、避坑指南

6.1 死循环检测

# 错误示范(无限重定向)
rewrite ^/login /auth.php permanent;
rewrite ^/auth /login permanent;

# 正确做法(添加终止条件)
rewrite ^/login$ /auth.php last;

6.2 特殊字符转义

# 处理包含问号的URL
rewrite ^/search\?(.*)q=(.*)$ /search.php?keyword=$2?;

6.3 缓存陷阱

# 开发环境禁用缓存
add_header Cache-Control "no-cache, no-store, must-revalidate";

七、调试技巧大全

7.1 实时调试方案

# 临时重定向调试
rewrite ^/test/(.*)$ /debug.php?url=$1 redirect;

7.2 日志分析技巧

# 自定义重写日志
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice;

八、应用场景全景图

8.1 SEO优化方向

  • 旧内容迁移保持权重
  • 规范化URL格式
  • 消除重复内容

8.2 安全防护领域

  • 隐藏真实路径
  • 阻止恶意扫描
  • 敏感目录伪装

8.3 业务需求实现

  • AB测试分流
  • 灰度发布控制
  • 地域化内容展示

九、技术方案双刃剑

9.1 优势亮点

  • 流量控制零成本
  • URL结构随心定制
  • 兼容历史链接

9.2 潜在风险

  • 正则复杂度失控
  • 多规则冲突
  • 性能损耗累积

9.3 最佳实践总结

  1. 先测试后上线原则:使用rewrite_log调试
  2. 正则表达式分级管理:简单规则前置
  3. 监控系统建立:关注301跳转统计
  4. 文档同步更新:维护规则变更日志