1. 为什么要关心Rewrite模块?

想象一下,你的网站就像一座复杂的立交桥。用户请求是车辆,服务器是目的地。当某些道路需要临时改道,或者你想让车辆自动走更高效的路线时,Nginx的Rewrite模块就是那个聪明的交通指挥员。它能修改请求路径实现URL重定向隐藏技术细节,就像给网站做了个"美容手术",让访问路径既优雅又高效。


2. Rewrite模块的核心语法

每个魔术师都有自己的咒语,Rewrite模块的魔咒长这样:

rewrite 正则表达式 替换目标 [flag];

举个真实的例子(技术栈:Nginx 1.18+):

# 把 /product/123 变成 /item.php?id=123
rewrite ^/product/(\d+)$ /item.php?id=$1 last;

^表示开头,\d+匹配数字,$1捕获第一个括号内容,last标志停止后续规则处理


3. 实战场景演练

3.1 消灭丑陋的index.php

需求:把https://example.com/index.php/post/42变成干净的https://example.com/post/42

# 技术栈:PHP网站 + Nginx
location / {
    rewrite ^/(.*)/index\.php/(.*)$ /$1/$2 permanent;
    rewrite ^/index\.php/(.*)$ /$1 permanent;
}

permanent返回301永久重定向,浏览器会记住这个跳转


3.2 旧版API迁移

需求:把已废弃的v1接口请求转到v2

# 技术栈:RESTful API服务
location /api/ {
    # 保留请求参数(?后面内容)
    rewrite ^/api/v1/(.*) /api/v2/$1$is_args$args break;
}

$args自动携带原始参数,break停止当前location内的后续rewrite规则


3.3 HTTPS强制护航

需求:所有HTTP请求强制跳转HTTPS

# 技术栈:全站SSL加密
server {
    listen 80;
    server_name example.com;
    
    # 保留原始请求路径
    rewrite ^(.*)$ https://$host$1 permanent;
}

$host变量自动获取域名,避免硬编码


4. 必须知道的五类Flag标签

标签 作用域 执行特点 适用场景
last server级别 停止当前规则,重新匹配 多阶段处理复杂逻辑
break location内 立即停止所有rewrite处理 最终处理
redirect 全局 302临时跳转 A/B测试
permanent 全局 301永久跳转 网站改版
- - 默认继续执行后续规则 简单路径改写

5. 那些年我们踩过的坑

5.1 无限循环陷阱

错误示例:

location /download/ {
    rewrite ^/download/(.*) /static/$1;
    rewrite ^/static/(.*) /download/$1;
}

这个配置会让/download/a.txt/static/a.txt互相跳转,就像猫追自己尾巴

解决方法:使用break标志或在正则中增加限制条件


5.2 正则表达式性能杀手

过度复杂的正则:

rewrite ^/(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)+$ /index.html;

当字母表扩大时,这个正则的匹配时间会指数级增长

优化建议:改用^/[a-z]+$这样的字符集写法


6. 为什么选择Nginx Rewrite?

6.1 三大优势

  1. 闪电速度:基于C语言的正则引擎,处理百万级请求毫无压力
  2. 灵活组合:可以配合mapif等指令实现智能路由
  3. 即时生效nginx -s reload即可应用新规则,无需重启服务

6.2 两点不足

  1. 调试困难:需要配合rewrite_log on;查看匹配过程
  2. 学习曲线:正则表达式和flag组合需要时间熟悉

7. 最佳实践清单

  1. 在测试环境先用redirect测试效果,确认无误再改permanent
  2. 复杂规则前添加注释说明业务场景,比如:
# 2023-08-更新:旧版活动页跳转
rewrite ^/2022-sale /campaign/black-friday permanent;
  1. 使用在线正则测试工具验证表达式
  2. 定期检查error.log中的rewrite相关警告
  3. 重要改动前备份配置文件

8. 总结:Rewrite的智慧

Nginx的Rewrite模块就像瑞士军刀,既能做精细的微创手术(比如参数转换),也能完成大规模的路由改造(比如全站迁移)。关键在于理解三个核心:

  • 精准匹配:用正则表达式锁定目标请求
  • 聪明跳转:根据业务需求选择适当的flag
  • 安全防护:通过测试和监控避免循环陷阱

当你能熟练使用rewrite时,会发现它不仅仅是URL转换工具,更是架构设计的润滑剂。无论是做灰度发布、多环境适配,还是SEO优化,这个看似简单的模块都能大显身手。下次遇到URL相关需求时,不妨先问自己:这个问题是否能用rewrite优雅解决?