
1. Nginx Rewrite功能概述Nginx的Rewrite功能是Web服务器配置中最强大且常用的特性之一。它允许我们通过正则表达式匹配和重写URL实现各种灵活的请求处理逻辑。在实际生产环境中我经常使用Rewrite来解决以下典型场景URL规范化统一带/或不带斜杠新旧URL结构的兼容处理动态URL伪装为静态路径多域名统一跳转A/B测试分流Rewrite规则的核心是PCRE正则表达式引擎它提供了完整的正则匹配能力。与Apache的mod_rewrite相比Nginx的Rewrite在性能上有明显优势因为它的规则是在配置加载阶段就编译完成的不像Apache需要在运行时解释。重要提示Rewrite规则处理顺序非常重要Nginx会按照配置文件中出现的顺序依次匹配一旦匹配成功就会立即执行并停止后续匹配。2. Rewrite指令详解2.1 基础语法结构Nginx的Rewrite指令基本语法如下rewrite regex replacement [flag];其中regexPCRE格式的正则表达式用于匹配当前请求URIreplacement替换字符串当正则匹配成功时使用flag可选参数控制重写后的处理行为我常用的flags包括last停止处理当前rewrite规则集用重写后的URI重新搜索locationbreak停止处理当前rewrite规则集但不再重新匹配locationredirect返回302临时重定向permanent返回301永久重定向2.2 正则表达式技巧经过多年实践我总结了几个高效的正则写法匹配数字IDrewrite ^/product/([0-9])$ /product.php?id$1 last;多参数捕获rewrite ^/search/([^/])/([^/])$ /search.php?keyword$1page$2 last;排除特定路径rewrite ^/(?!admin|static)(.*)$ /newpath/$1 last;文件扩展名处理rewrite ^(/[^.?]*)\?([^?]*)$ $1.php?$2 last;3. 实战应用场景3.1 新旧URL兼容处理在网站改版时我常用Rewrite保持旧链接可用location / { rewrite ^/old-page.html$ /new-page permanent; rewrite ^/category/(.*)\.html$ /shop/$1 last; }这种处理可以保持SEO权重不流失避免用户书签失效平滑过渡到新URL结构3.2 多域名统一对于拥有多个域名的站点我通常这样统一主域名server { listen 80; server_name example.com www.example.com; if ($host ! example.com) { rewrite ^/(.*)$ https://example.com/$1 permanent; } }3.3 前后端分离路由在Vue/React等SPA项目中我这样配置保证刷新不404location / { try_files $uri $uri/ /index.html; }4. 高级技巧与优化4.1 性能优化建议避免过多Rewrite嵌套我见过一个配置有15层rewrite严重影响性能。建议控制在3层以内。合理使用break标志当确定不需要继续匹配时使用break能减少不必要的匹配过程。正则表达式优化尽量使用^和$明确界定起止避免过度使用通配符.*优先使用[^/]而非.限定范围4.2 调试技巧我常用的Rewrite调试方法开启Nginx调试日志error_log /var/log/nginx/rewrite.log notice;使用return测试location /test { return 200 URI: $uri\nARGS: $args; }分阶段验证先测试正则匹配再测试替换结果最后加标志位。5. 常见问题解决5.1 循环重定向问题这是我最常遇到的问题之一典型表现是浏览器报错重定向次数过多。解决方法检查rewrite标志是否正确使用last或break添加条件判断避免无限循环if ($request_uri ~ ^/path/(.*)) { rewrite ^ /newpath/$1 last; }5.2 特殊字符处理当URL包含特殊字符时我这样处理rewrite ^/search/(.*)$ /search.php?q$1? last;其中?表示非贪婪匹配防止截断特殊字符。5.3 与try_files的配合我推荐这样组合使用location /images { try_files $uri imageproxy; rewrite ^/images/(.*)$ imageproxy last; } location imageproxy { proxy_pass http://image-service; }6. 安全注意事项在配置Rewrite时我特别注意以下几点安全防护过滤用户输入rewrite ^/user/([a-zA-Z0-9_-])$ /profile.php?user$1 last;防止目录遍历rewrite ^/download/([^/])$ /download.php?file$1 last;限制重定向范围if ($request_uri ~* \.\./) { return 403; }7. 性能测试与监控我通常使用以下方法评估Rewrite性能使用ab测试ab -n 1000 -c 100 http://example.com/rewrite-test监控Nginx指标log_format rewrite_log $remote_addr - $request [$time_local] $uri - $rewritten_uri $status;对比有无Rewrite的QPS差异确保性能损耗在可接受范围。8. 最佳实践总结根据我的经验高效使用Rewrite应遵循以下原则明确目标每个rewrite规则都应解决具体问题避免过度设计保持简洁能用简单正则就不用复杂表达式合理排序将高频匹配的规则放在前面充分测试特别是正则表达式的边界情况文档注释为复杂规则添加说明方便后续维护一个典型的良好实践配置示例# 新旧URL映射保持SEO rewrite ^/old-blog/(.*)$ /news/$1 permanent; # 伪静态化处理 rewrite ^/product/([0-9])/?$ /product.php?id$1 last; # 多域名统一 if ($host ~* ^www\.(.*)) { set $domain $1; rewrite ^(.*)$ https://$domain$1 permanent; } # API版本控制 rewrite ^/api/v1/(.*)$ /api/current/$1 last;在实际项目中我通常会建立一个rewrite规则文档记录每个规则的目的、创建时间和负责人这对团队协作和后期维护非常有帮助。