PHP网站Google YouTube Data API v3 IP限制后调用失败求助
这种情况我之前帮同行排查过好几次,大概率是这些容易被忽略的细节在作祟:
出口IP与你确认的不一致:
很多云服务器、共享主机或者使用反向代理的环境,对外发起请求的出口IP和你通过ping服务器得到的IP不是同一个!比如有些服务商的服务器内部用私有IP,对外请求时走NAT网关,出口是另一个公网IP。
你可以直接在服务器上执行命令获取真实出口IP:curl ifconfig.me # 或者 wget -qO- ifconfig.co这个返回的IP才是需要添加到Google API IP白名单里的地址。
IP限制规则的格式或逻辑错误:
- 确认你添加的是允许规则而非拒绝规则,别搞反了逻辑;
- 单个IP的话,Google Cloud支持直接填纯IP(比如
123.123.123.123),也支持CIDR格式(比如123.123.123.123/32),如果格式有误(比如多了空格、符号)会导致规则不生效; - 如果你的服务器有多个出口IP,要把所有可能的出口IP都添加进去。
规则生效有延迟:
Google Cloud的IP限制规则不是即时生效的,有时候需要等待5-15分钟才能完全同步。修改完规则后别急着测试,等一会儿再验证。另外,也可以重启下服务器的PHP-FPM服务或者网络服务,清除本地可能存在的请求缓存。服务器使用了代理/VPN:
如果你的服务器配置了全局代理、VPN,或者PHP代码里设置了curl代理(比如CURLOPT_PROXY选项),那请求的出口IP就是代理服务器的IP,而非服务器本身的IP。检查下PHP代码中的curl配置,以及服务器的系统环境变量(比如HTTP_PROXY、HTTPS_PROXY)。IPv6访问的干扰:
如果你的服务器同时支持IPv4和IPv6,而你只添加了IPv4的IP限制,那API请求可能会通过IPv6通道发起,导致被拦截。你可以在服务器上强制用IPv4测试请求:curl -4 https://www.googleapis.com/youtube/v3/videos?part=snippet&id=example&key=YOUR_API_KEY如果这个请求正常,而不加
-4的请求被拦截,就需要把服务器的IPv6地址也添加到IP白名单里。API密钥与规则绑定错误:
最后再确认一遍:你设置IP限制的那个API密钥,确实是PHP代码中正在使用的密钥。有时候开发者可能有多个密钥,不小心把限制加在了闲置的密钥上,而代码里用的还是无限制的版本(不过你说无限制时正常,加限制就失效,这个概率低,但也可以排查下)。
如果以上都没问题,建议去Google Cloud的API控制台查看请求日志,里面会明确显示被拦截请求的来源IP,对比你设置的白名单IP,就能直接定位问题了。
内容的提问来源于stack exchange,提问作者Vmxes

