Ubuntu VPS上Dart调用GeminiAPI触发地域限制错误的问题排查
Dart服务器调用Gemini API出现地域限制错误的问题及排查
问题现象
我使用shelf包搭建了一个简单的Dart服务器,用于向generativelanguage.googleapis.com发起请求。本地运行完全正常,但部署到位于德国的Ubuntu VPS上时,API返回以下错误:
{ "error": { "code": 400, "message": "User location is not supported for the API use.", "status": "FAILED_PRECONDITION" } }
该VPS确实位于德国,且Gemini API支持德国地区,IP归属地查询也显示为德国。
不同请求方式的测试结果
- VPS上直接使用
curl发起请求,可正常获取数据; - Dart中通过
Process.run调用curl,请求正常工作; - 使用dart:http、pub.dev的google_generative_ai包、dio及自定义HTTP客户端发起请求时,均返回上述地域限制错误;
- 同一VPS上运行等效的Python Flask服务器,请求可正常完成。
已尝试的排查操作
- 创建自定义HTTP客户端并设置所有可能的请求头;
- 更换多个User-Agent;
- 尝试启用/禁用SSL;
- 设置CORS头;
- 将本地Dart服务器容器化后部署到VPS;
- 分析网络流量,确认请求来自德国的正确IP;
- 更换服务器端口;
- 将服务器部署在Nginx之后;
- 在WSL上运行服务器,请求正常工作;
- 在Dart应用中请求并打印自身IP;
- 向其他API发起HTTP请求,均正常响应;
- 验证Dart中的API密钥正确性:在密钥后追加无效字符会返回密钥无效错误,确认密钥本身有效;
- 将Dart服务器部署到globe.dev上,请求正常工作。
后续定位与临时解决方案
- 测试发现:使用
curl -4会触发相同的地域限制错误,curl -6则正常,怀疑VPS的IPv4地址被拦截; - 在Ubuntu上禁用IPv4或提高IPv6优先级,无法改变dart:http的默认行为;
- 手动强制dart:http使用IPv6并手动信任证书可解决问题,但该方案不够优雅;
- 使用squid代理并在Dart的HTTP客户端中配置代理,即使全程使用IPv4也能正常工作;
- 最终定位为Dart VM的问题:Dart会优先解析IPv4,延迟后才解析IPv6,导致请求走了被拦截的IPv4地址。
内容的提问来源于stack exchange,提问作者NoctisBeta
相关产品推荐
相关产品推荐

