GCP内部ILB返回405 Method Not Allowed问题求助
我有两个Cloud Run服务:一个是代理服务,负责将流量转发至托管Angular静态网站的Cloud Storage存储桶;另一个是API服务,提供数据接口。我已创建内部区域ILB,并配置了基于路径的路由规则来分发流量至两个不同后端。
用curl直接调用ILB的API URL可正常获取数据,但静态网站通过JavaScript发起POST请求至https://something.com/api/id时,返回405 - Method Not Allowed错误,请求详情如下:
Request URL:
https://something.com/api/id
Request Method:
POST
Status Code:
405
Remote Address:
....*:443
Referrer Policy:
strict-origin-when-cross-origin
对应的Terraform URL Map代码如下:
# URL map resource "google_compute_region_url_map" "url_map_euw3" { name = "${var.lb_prefix}-ilb-regional-url-map" project = frontend_project.project_id region = "europe-west1" default_service = google_compute_region_backend_service.service_euw3["first-cloud-run"].id host_rule { hosts = ["*"] path_matcher = "default-path-matcher" } path_matcher { name = "default-path-matcher" default_service = google_compute_region_backend_service.service_euw3["first-cloud-run"].id path_rule { paths = ["/api/id"] service = google_compute_region_backend_service.service_euw3["second-cloud-run"].id route_action { url_rewrite { path_prefix_rewrite = "/id" } } } path_rule { paths = ["/*"] service = google_compute_region_backend_service.service_euw3["first-cloud-run"].id } } }
排查与解决思路
处理CORS预请求(OPTIONS)
浏览器发起跨域POST请求前,会自动发送OPTIONS预请求。如果API服务未配置CORS规则允许OPTIONS方法,预请求会失败,最终表现为POST返回405。- 解决:在API服务的响应中添加CORS头:
Access-Control-Allow-Origin: https://something.com、Access-Control-Allow-Methods: POST, OPTIONS、Access-Control-Allow-Headers: Content-Type等必要字段。
- 解决:在API服务的响应中添加CORS头:
验证路径重写后的API端点兼容性
URL Map将/api/id重写为/id,需确认API服务的/id端点是否支持POST方法。用curl直接测试重写后的路径:curl -X POST https://[ILB内部地址]/id如果该请求也返回405,说明API服务本身的
/id端点不支持POST,需调整API的路由配置。确认后端服务的HTTP方法限制
检查指向API服务的google_compute_region_backend_service配置,确保没有限制POST或OPTIONS方法。默认情况下Cloud Run后端服务允许所有HTTP方法,但如果有自定义配置,需保证POST和OPTIONS未被排除。检查浏览器请求的实际流向
打开浏览器开发者工具的Network面板,确认POST请求的路径、方法是否正确,是否因为前端代码错误发送到了代理服务而非API服务。
内容的提问来源于stack exchange,提问作者Subhajit Pal

