Chrome 地理定位传感器破坏 CORS

Posted

技术标签:

【中文标题】Chrome 地理定位传感器破坏 CORS【英文标题】:Chrome Geolocation Sensors Breaking CORS 【发布时间】:2020-06-16 09:44:50 【问题描述】:

我有一个应用程序从地理定位 api 中提取 lat/lng,并对休息 api 进行一些反向地理编码。

我曾经能够在开发者工具中使用 Chrome 传感器覆盖来测试不同的位置。但是,最近生成的 AJAX 调用已停止工作,即使我知道其余 api 正确设置了 CORS 标头,我也收到了 CORS 错误。事实上,当我将位置设置为“无覆盖”时,呼叫正常工作。

我已经设置了一个小提琴here 来演示。它访问的 url 没有设置 CORS(我找不到设置的公共回显),但可以看到行为。

观看网络标签。选择“无覆盖”时,Chrome尝试执行直接获取请求。选择“伦敦”时,Chrome发送选项请求,此请求失败是否为CORS或不配置REST API。显然,在小提琴中,所有这些都因为 api 而失败,但即使是正确配置的端点也会失败,并出现通常的 header not set 错误。

这是一个错误还是我遗漏了什么?

$('button').on('click', function(e) 
  navigator.geolocation.getCurrentPosition(function(position) 
    var lat = position.coords.latitude;
    var lng = position.coords.longitude;
    $.get('https://postman-echo.com/get?q=' + lat + ';' + lng, function(res) 
      console.log(res.body);
    );
  );
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>
  Click
</button>

【问题讨论】:

【参考方案1】:

在上面 Sami 的回复中添加更多内容:

正在为纬度、经度、时区和区域设置应用浏览器传感器覆盖。区域设置覆盖导致设置 Accept-Language 的浏览器请求标头。

Accept-Language: mr_IN

因此,如果您只对位置感兴趣,则可以通过不设置区域设置覆盖来避免错误。

【讨论】:

原来这是一个错误,但是是的,你是对的,现在将语言环境和时区留空是一种解决方法。 bugs.chromium.org/p/chromium/issues/… 谢谢,只需在时区和语言环境中留空即可。【参考方案2】:

使用位置覆盖时,CORS API 应允许标头 Accept-Language:

Access-Control-Allow-Headers: Accept-Language

【讨论】:

谢谢,有这方面的文档吗? 由于您只是将其用于测试,我建议您使用extension 而不是更改您的 API。 谢谢,是的,在你指出之后我注意到了新的标题。我只是对为什么改变它感到困惑。不幸的是,我不会是唯一的测试者——我想潜在客户也希望能够测试不同的位置,因此更新 api 将是最好的解决方案。

以上是关于Chrome 地理定位传感器破坏 CORS的主要内容,如果未能解决你的问题,请参考以下文章

如何测试地理位置 javascript?

为啥标题在带有 chrome 的 android 上的地理定位中保持“空”

Chrome 地理定位在更新后停止工作

为移动 Chrome 上的本地文件启用地理定位

Javascript地理定位不适用于更新的android chrome

Geolocation地理定位