Elastic Beanstalk部署的Nginx Rewrite规则未触发,求问题排查
问题分析与修正方案
你的配置存在两个关键问题,导致rewrite规则未触发:
1. URI变量选择错误
Nginx的$uri变量是解码后的请求路径,当用户请求包含%23的URL时,$uri里的%23已经被自动解析为#,所以你的正则^([^#]*)%23(.*)$根本匹配不到任何内容。
需要改用$request_uri变量,它保存的是原始未解码的请求URI(包含%23这类编码字符)。
2. 重复的location /块冲突
Elastic Beanstalk的默认Nginx配置中已经定义了location /块,你在conf.d目录下新增另一个location /会导致Nginx配置冲突——同一个server块内不能存在多个匹配优先级相同的location /,Nginx会优先使用主配置中的location /,完全忽略你的规则。
修正后的配置文件
将.ebextensions/nginx/conf.d/rewrite.config的内容替换为:
files: "/etc/nginx/conf.d/rewrite.conf": mode: "000644" owner: root group: root content: | # 在server级别添加rewrite规则,避免与已有location块冲突 if ($request_uri ~* "^([^#]*)%23(.*)$") { set $new_uri $1#$2; rewrite ^ $new_uri permanent; }
额外注意事项
- 配置文件权限:
000644足以满足Nginx读取需求,原配置的000755属于多余的执行权限。 - 验证规则:部署后可以查看Nginx错误日志
/var/log/nginx/error.log,确认规则是否触发;也可以通过curl -I "http://your-domain/path%23test"测试301跳转是否生效。
内容的提问来源于stack exchange,提问作者Omar Dulaimi
相关产品推荐
相关产品推荐

