Nginx rewrite规则:从入门到放弃再到真香
大家好,我是33blog的技术博主。今天想和大家聊聊Nginx配置中那些让人又爱又恨的rewrite规则。说实话,刚开始接触rewrite的时候,我经常被各种正则表达式绕得头晕眼花,甚至一度想放弃。但经过多次踩坑和实践后,我发现rewrite规则其实是个超级实用的功能。
rewrite基础语法
首先来看最基本的rewrite语法格式:
rewrite regex replacement [flag];
这个简单的三部分结构,却可以玩出各种花样。记得我第一次使用时,把正则表达式写错了,结果导致整个网站404,吓得我赶紧回滚配置。
常见rewrite场景
1. 强制HTTPS跳转
现在基本所有网站都要上HTTPS了,这个rewrite规则可以说是标配:
rewrite ^(.*)$ https://$host$1 permanent;
我第一次配置时漏掉了permanent
标志,结果浏览器缓存了错误的跳转,导致用户访问异常。这个教训让我记住了flag的重要性。
2. 美化URL
把动态URL转成伪静态,对SEO很友好:
rewrite ^/article/(d+)$ /article.php?id=$1 last;
这里要注意last
标志表示停止处理当前rewrite规则,继续匹配其他location。我曾经因为用错flag导致无限循环,Nginx直接报错。
3. 域名重定向
网站改版换域名时特别有用:
rewrite ^/(.*)$ http://newdomain.com/$1 permanent;
高级技巧
1. 条件判断
Nginx的if语句可以和rewrite配合使用:
if ($host != 'www.33blog.com') {
rewrite ^(.*)$ http://www.33blog.com$1 permanent;
}
注意:if语句在Nginx中被称为”邪恶的if”,使用不当会影响性能,建议只在确实需要时使用。
2. 多级rewrite
有时候需要多个rewrite规则配合:
rewrite ^/old-path/(.*)$ /new-path/$1;
rewrite ^/new-path/(.*)$ /final-path/$1 last;
这种链式rewrite要特别注意flag的使用顺序,我曾在生产环境因为这个问题调试了整整一个下午。
调试技巧
分享几个我总结的调试经验:
- 使用
rewrite_log on;
开启rewrite日志 - 先在小范围测试,确认无误再应用到生产环境
- 善用
return 302
临时跳转进行测试 - 准备回滚方案,配置出错时能快速恢复
最后想说,rewrite规则虽然看起来简单,但实际使用时有很多细节需要注意。希望我的这些经验能帮你少走些弯路。如果你有更好的rewrite技巧,欢迎在评论区分享!
大佬这文章太实用了!正好最近被rewrite搞到头大,看完感觉清晰多了👍
请问下rewrite_log的日志文件默认放在哪里啊?找了半天没找到
真实了!第一次配rewrite的时候把整个网站搞崩了,吓得我连夜删配置😂