Google Cloud负载均衡器路由规则不生效问题求助
问题情况
给X、Y两个后端服务配了负载均衡,想实现:
- 访问
dev.somedomain.io→ 走X服务 - 访问
dev.somedomain.io/shopify→ 走Y服务 - 访问
dev.somedomain.io/api→ 走X服务
结果只有根路径和最后一条/*的规则能生效,/api和/shopify全报404,完全没匹配到对应的规则。
几个大概率的问题点和解决办法
1. 路由顺序搞反了
几乎所有负载均衡器(不管是Nginx、AWS ALB还是Kong这类网关)都是按规则顺序从上到下匹配,匹配到第一条就停。要是你把/*这条通配规则放在最前面,那所有请求都会先命中它,后面的/api、/shopify规则根本轮不到执行。
改法:
把具体路径的规则挪到前面,兜底的通配规则放最后:
- 第一条:精确匹配
/→ 转发到X服务 - 第二条:前缀匹配
/api→ 转发到X服务 - 第三条:前缀匹配
/shopify→ 转发到Y服务 - 第四条:
/*→ 转发到X服务(兜底用)
2. 路径匹配模式选错了
很多负载均衡器的路径匹配分精确匹配和前缀匹配两种模式。比如你要是给/api设了精确匹配,那只有dev.somedomain.io/api这个 exact path 能命中,要是用户访问的是/api/getUser这种子路径,就会落到/*规则里;反过来,如果/shopify需要精确匹配,但你设成了前缀匹配,也可能导致不符合预期的请求被转发,但这里的404更可能是匹配模式不对导致没命中规则。
改法:
按需选匹配模式:
- 要匹配
/api及其所有子路径(比如/api/v1/orders),就用前缀匹配(语法看负载均衡器,有的是/api/*,有的直接写/api就行) - 只需要匹配
/shopify这个单独路径,就用精确匹配模式
3. 转发时没处理路径前缀
比如你配置/shopify转发到Y服务,但负载均衡器直接把/shopify这个完整路径传给Y服务,而Y服务本身的接口根路径是/,根本没有/shopify这个路由,自然就返回404了。
改法:
配置路径重写,把前缀去掉。举几个常见例子:
- Nginx里加
rewrite ^/shopify(.*)$ $1 break; - AWS ALB开启“重写路径”,把
/shopify/*改成/$1 - Kong里把
strip_path设为true
4. 后端服务自己的路由有问题
别光查负载均衡,也看看X服务是不是真的有/api开头的接口,Y服务是不是有对应路径(或者是不是需要去掉前缀后的路径)。比如X服务的API都是从/开始的,但负载均衡器把/api传过去,X服务找不到这个路径,肯定404。
改法:
要么调负载均衡的路径重写规则,要么改后端服务的路由,让它能识别带前缀的路径。
内容的提问来源于stack exchange,提问作者dasisderblyme

