HTTPS Load Balancer对接Cloud Run时返回链接路径缺失故障
问题根因
出现路径前缀丢失的核心原因是GCP HTTPS负载均衡的URL Map默认会在转发请求到后端Cloud Run时,把匹配到的路径前缀剥离。比如你访问https://custom.domain.com/hello-no-auth/xxx,转发到Cloud Run实例的请求实际路径已经变成/xxx,后端服务基于收到的请求路径生成根相对路径的资源、跳转链接时,自然不会带上被LB剥掉的/hello-no-auth前缀。
直连Cloud Run时没有LB做路径改写,服务收到的是完整请求路径,所以链接生成完全正常。
可落地方案
按改造成本从低到高排序:
方案1:LB添加转发前缀头+后端开启反向代理信任(无业务侵入,最推荐)
不需要改业务代码逻辑,只需要做两处配置:
- 负载均衡侧:找到对应URL Map中指向Cloud Run的路径规则,编辑后端服务的请求头修改规则,新增自定义请求头:
X-Forwarded-Prefix: /hello-no-auth,把被剥离的路径前缀通过请求头传给后端。如果有多条不同前缀的路径规则,每条规则对应传自己的前缀值即可。 - 后端服务侧:开启服务的反向代理信任配置,几乎所有主流Web框架都原生支持识别
X-Forwarded-Prefix头,自动在生成链接时拼接对应前缀,不需要手动写拼接逻辑:- Spring Boot:配置
server.forward-headers-strategy=native - Django:配置
USE_X_FORWARDED_HOST = True,加简单中间件从请求头读取X-Forwarded-Prefix赋值给FORCE_SCRIPT_NAME即可 - Express:开启
app.set('trust proxy', true),路由和静态资源中间件会自动识别前缀头 - 纯Nginx托管静态页:配置
sub_filter替换页面内的根路径引用,自动拼接前缀头的值
配置完成后强制刷新浏览器缓存(Ctrl+F5)即可验证效果。
- Spring Boot:配置
方案2:后端全局配置基础路径
如果不方便修改LB配置,可以直接在后端服务里全局配置路由、静态资源的基础路径为/hello-no-auth:
- 不要在代码、模板里硬编码根相对路径(比如
/assets/icon.svg),所有资源、跳转引用统一走全局basePath变量拼接 - 框架本身一般都提供全局basePath配置项,比如Next.js的
basePath配置、Vue/React构建时的publicPath配置,直接设置为对应前缀即可,后续如果LB前缀调整只需要改这一处配置。
方案3:关闭LB路径剥离,透传全路径
调整URL Map配置,转发到Cloud Run时不做路径改写,直接把完整请求路径透传给后端,同时把Cloud Run服务本身的所有路由也加上/hello-no-auth前缀。这种模式下后端收到的请求和直连场景一致,自然不会出现链接前缀丢失的问题,缺点是后端服务路由需要和LB前缀强绑定,调整前缀时需要同步改服务路由配置。
内容的提问来源于stack exchange,提问作者Cmac199
相关产品推荐
相关产品推荐

