Nginx配置白屏血泪史:rewrite规则里的斜杠竟然这么要命
昨天给客户部署新站时遇到个邪门问题:配置完伪静态后,首页直接白屏,连500错误都不给。折腾两小时才发现是rewrite规则里少了个斜杠,记录下这个价值2000块的教训。
环境是LNMP+ThinkPHP6,伪静态规则照搬官方文档:
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
看起来没问题对吧?但实际访问时死活不解析,关键点在于规则末尾的斜杠。实测发现必须写成rewrite ^(.*)$ /index.php?s=$1/ last;才能生效,特别是当路由带参数时。
更坑的是这种错误:
1. 不会触发Nginx错误日志
2. Chrome开发者工具显示200状态码
3. 服务器返回空响应体
排查时先后排除了PHP-FPM进程挂掉、文件权限问题、路由配置错误,最后用curl -v才发现请求根本没进PHP解释器。
总结三个排查姿势:
1. 先看access_log:确认请求是否真的打到后端
2. 禁用所有rewrite:用rewrite_log on;输出调试
3. 手动拼接URL:在浏览器直接访问/index.php?s=/测试路由
现在终于理解为什么老鸟都说"Nginx的斜杠能逼疯强迫症",这玩意在proxy_pass、alias、rewrite里全是不同的语义,下次再碰到白屏问题,我决定先给所有可能缺斜杠的地方都怼上/再说...

