说起来有点好笑,我第一次接触Nginx重写规则是因为一个尴尬的乌龙。当时我把自己博客的永久链接结构改了,结果所有老链接都404了。那一刻我慌得不行,赶紧翻文档找解决方法,这才发现原来rewrite规则这么好用!
说白了,重写规则就是让URL按照你的想法来”变身”。比如把/article/123变成/post?id=123,或者把带www的域名重定向到不带www的版本。这些看似简单的操作,在SEO和用户体验上却能带来很大提升。
rewrite ^/old-url$ /new-url permanent;
记得有次配置完规则后,网站直接崩了。折腾半天才发现,原来是在location块里写了死循环。所以提醒大家,配置前一定要想清楚逻辑流向,不然就像我一样,半夜两点还在debug。
我现在养成了习惯,每次搭建新站点都会预设几个重写规则。比如强制HTTPS,这个真的很有必要:
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
还有个特别常用的就是域名规范化。我见过太多网站因为www和非www版本同时存在,导致SEO权重分散的情况。
如果你用的是WordPress,这个规则一定要加:
location / {
try_files $uri $uri/ /index.php?$args;
}
这个规则能让所有不存在的请求都交给WordPress处理,实现漂亮的永久链接。
我习惯在测试时开启rewrite日志,虽然会产生大量日志,但排查问题真的方便:
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice;
有时候规则看起来没问题,但就是不生效。这时候可以先用return 200 "test";来测试匹配,确认规则生效后再改成实际的重写逻辑。
配置完记得用nginx -t测试语法,然后nginx -s reload重新加载配置。记住,永远不要在生产环境直接重启,先测试!
现在我配置重写规则已经轻车熟路了,但每次看到那些优雅的URL转换,还是会觉得特别有成就感。希望我的这些经验能帮到正在踩坑的你。
参与讨论
第一次改永久链接把我逼疯了,看到作者写的这些步骤真是恍然大悟,尤其是那句别在生产环境直接重启,太实用了。
有同感!location 写不好真的能把站炸了,建议多用 return 200 测试匹配,省了不少时间。
强制 HTTPS 和域名规范化这块必须要,SEO 权重这事不可小觑,尤其是老站改版前要先把重写规则想清楚。
试试把 rewrite_log 开着配合 nginx -t,虽然日志多但能快速定位问题,配完别忘了 reload 而不是 restart 👍
哈哈我当年也是因为试错把博客弄挂了,后来学会了 try_files 和 return 测试,更新速度慢点但安全多了,催更作者多出点这类实操案例!