一、为什么需要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 最佳实践总结
- 先测试后上线原则:使用
rewrite_log
调试 - 正则表达式分级管理:简单规则前置
- 监控系统建立:关注301跳转统计
- 文档同步更新:维护规则变更日志