NGINX带$符号URL的请求转发配置问题求助
NGINX 路径转发配置解决方案
问题分析
你的配置存在两个核心问题:
- 正则表达式范围过窄,仅能匹配
/$/开头的路径,无法覆盖/$本身的情况; - NGINX 默认拒绝 URI 中包含
$字符的请求,直接返回 400 错误。
正确配置示例
server { listen 80; server_name example.com; # 允许 URI 中包含 $ 字符,避免 400 错误请求 unsafe_uri_chars "$"; # 匹配所有形如 /$、/$/、/$/a、/$/a/、/$/a/b/ 的请求 location ~ ^/\$(/.*)?$ { proxy_pass http://upstream-server2; # 可添加其他代理配置,例如: # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; } # 其余请求转发至上游服务器1 location / { proxy_pass http://upstream-server1; # 可添加其他代理配置 } }
配置说明
unsafe_uri_chars "$";:解除 NGINX 对 URI 中$字符的限制,避免直接返回 400 错误。- 正则表达式
^/\$(/.*)?$:^/\$:匹配路径以/$开头的请求;(/.*)?:允许/$后跟随任意路径(包括空值,即/$本身),完美覆盖你需要的所有路径格式。
- 匹配优先级:正则匹配的优先级高于前缀匹配(
location /),符合条件的请求会优先转发至上游服务器2,其余请求自动走服务器1。
编码 URI 处理
NGINX 在匹配location时会自动解码 URI,因此%24会被解析为$,上述配置无需额外修改即可处理example.com/%24、example.com/%24/a等编码后的请求。
内容的提问来源于stack exchange,提问作者morpheus
相关产品推荐
相关产品推荐

