Nginx map路由配置问题:含de的URI无法转发至app_b且报错
问题解决:Nginx通过Map实现URI前缀路由转发
错误原因分析
你的配置存在三个核心问题:
- 匹配规则不符合需求:原配置用
^.*de.*$会匹配任何包含de字符的URI,而非你需要的以de开头的URI; - 变量为空导致URL错误:当请求URI不匹配任何map规则时,
$resources_location会为空,拼接后http://$resources_location变成http://,触发invalid URL prefix错误; - 后端地址格式冗余:map值里的结尾
/会导致Nginx转发路径时出现不必要的拼接问题。
修正后的配置
# 定义map规则:根据URI匹配对应的后端服务 map $uri $backend { # 根路径请求转发到app_a "/" "app_a:1234"; # 以/de开头的URI转发到app_b "^/de.*$" "app_b:2345"; # 默认规则:所有未匹配的请求都转发到app_a default "app_a:1234"; } server { listen 80; listen [::]:80; server_name example.com; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; # 转发到map匹配到的后端服务 proxy_pass http://$backend; proxy_redirect off; } # 静态资源路径同样使用map匹配的后端 location ~ ^/(assets|public|favicon.ico) { proxy_pass http://$backend; } }
关键调整说明
- 匹配规则修正:用
^/de.*$精准匹配以/de开头的URI,完全符合你的需求; - 添加默认值:通过
default规则确保$backend永远不会为空,彻底解决URL前缀错误; - 简化后端地址:去掉map值里的结尾
/,Nginx会自动将完整的请求路径转发给后端,避免路径拼接混乱; - 可选优化:用
$uri代替$request_uri做匹配,$uri仅包含请求路径(不含查询参数),匹配逻辑更精准。
内容的提问来源于stack exchange,提问作者Murakami
相关产品推荐
相关产品推荐

