当在 Nginx 中使用 rewrite 指令遇到问题时,以下是常见错误及其解决方法:
错误现象:浏览器显示"重定向过多"或服务器日志显示大量 301/302 重定向
解决方法:
# 确保重写条件不会匹配重写后的URL
location /oldpath/ {
rewrite ^/oldpath/(.*)$ /newpath/$1 break;
# 或者使用 last 标志但要确保不会循环
}
错误现象:Nginx 配置测试失败 (nginx -t 报错)
解决方法:
# 确保正则表达式语法正确
rewrite ^/user/([0-9]+)/?$ /profile.php?id=$1 last;
错误现象:重写后的URL不正确或包含未预期的字符
解决方法:
# 正确使用变量
rewrite ^/download/(.*)/file$ /downloads/$1.zip last;
错误现象:重写行为不符合预期
标志说明:
- last
- 停止处理当前重写指令,继续匹配location
- break
- 停止所有重写处理
- redirect
- 返回302临时重定向
- permanent
- 返回301永久重定向
检查Nginx错误日志:
tail -f /var/log/nginx/error.log
测试配置语法:
nginx -t
使用return调试:
rewrite ^/testpath$ /debug last;
location = /debug {
return 200 "Debug info: $uri $args";
}
启用rewrite日志(仅限调试):
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice;
server {
listen 80;
server_name example.com;
# 重写规则示例
rewrite ^/old-page$ /new-page permanent;
location /users/ {
# 捕获数字ID
rewrite ^/users/([0-9]+)$ /profile.php?id=$1 last;
# 捕获用户名
rewrite ^/users/([a-zA-Z0-9_-]+)$ /profile.php?username=$1 last;
}
location /downloads/ {
# 防止循环
if ($request_uri ~* "/downloads/(.*)\.zip$") {
break;
}
rewrite ^/downloads/([^/]+)$ /storage/$1.zip break;
}
# 其他配置...
}
如果问题仍未解决,请提供具体的错误信息和rewrite规则,我可以给出更针对性的建议。