You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Maps Static API在HTTPS与HTTP/2环境下请求异常问题

问题:HTTPS部署页面调用Google Maps Static API时HTTP/2请求返回400错误

我有一个通过HTTPS部署的网页,需要展示Google Maps Static API生成的地图图片。最初尝试用HTTP请求API,代码如下:

<img src="http://maps.googleapis.com/maps/api/staticmap?client=CLIENT_ID&signature=MY_SIGNATURE"/>

但在Chrome的「检查-网络」面板中发现,请求被自动转为HTTPS协议(推测使用HTTP/2)。直接在浏览器地址栏发起该HTTPS请求时,返回400错误,提示:

Your client has issued a malformed or illegal request

通过Postman测试不同请求组合,结果如下:

  • http + http1.1 → 响应200
  • http + http2 → 响应200
  • https + http1.1 → 响应200
  • https + http2 → 响应400(错误提示同上)

解答

核心问题出在HTTP/2协议下的请求签名验证逻辑。Google Maps Static API的签名是严格基于请求的原始URL(包括协议部分)生成的,当使用HTTPS + HTTP/2发起请求时,会触发两种导致签名不匹配的情况:

  1. HTTP/2伪头字段的影响:HTTP/2使用:scheme伪头字段标记请求协议为https,而你当前的签名是基于HTTP协议的URL生成的。服务器在HTTP/2环境下验证签名时,会把:scheme的https纳入校验范围,导致签名与实际请求不匹配,直接返回400错误。
  2. 请求结构的细微差异:HTTP/2对请求的处理逻辑和HTTP/1.1存在细节区别,比如部分字段的编码方式,而签名是绑定原始请求结构的,这种差异会被服务器判定为非法请求。

另外,你看到Chrome自动把HTTP请求转为HTTPS,是因为maps.googleapis.com启用了HSTS(HTTP严格传输安全),浏览器会自动将该域名的HTTP请求强制升级为HTTPS,并且优先使用HTTP/2协议发起请求。

解决办法

  1. 重新生成HTTPS协议的签名:
    将请求URL替换为HTTPS版本:https://maps.googleapis.com/maps/api/staticmap?client=CLIENT_ID,然后基于这个HTTPS URL重新生成签名,替换代码中的MY_SIGNATURE。这样HTTP/2环境下的请求就能通过签名验证。
  2. 强制使用HTTP/1.1(不推荐):
    如果暂时无法重新生成签名,可以通过服务器配置(如Nginx)强制该API请求使用HTTP/1.1,但这会损失HTTP/2的性能优势,且不符合现代网页安全规范,仅作为临时方案。

内容的提问来源于stack exchange,提问作者pazukdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:41:09