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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:47:22