我在我的网站上请求用户的地理位置数据时遇到了这个错误:
getCurrentPosition() 和 watchPosition() 在不安全的源上已被弃用,并且将来将不再支持。您应该考虑将应用程序切换到安全源,例如HTTPS。有关详细信息,请参见goo.gl/rStTGz。
我的意思是,这只是一个通知,而谷歌链接只是说它正在被弃用。
我没有计划将我的网站移动到SSL...那么像我这样的人是否有替代方案?
我在我的网站上请求用户的地理位置数据时遇到了这个错误:
getCurrentPosition() 和 watchPosition() 在不安全的源上已被弃用,并且将来将不再支持。您应该考虑将应用程序切换到安全源,例如HTTPS。有关详细信息,请参见goo.gl/rStTGz。
我的意思是,这只是一个通知,而谷歌链接只是说它正在被弃用。
我没有计划将我的网站移动到SSL...那么像我这样的人是否有替代方案?
因为根据你的架构,切换到HTTPS可能很麻烦或不可能,我找到了一个解决方法:你可以使用Google Maps Geolocation API。尽管它有使用限制,但它能胜任。你需要一个浏览器API密钥,所以不要忘记将其使用限制为您页面的主机名。
如果getCurrentPosition()
方法失败,我将其用作后备方法。 这使我可以让它在我切换到HTTPS之前正常工作。
以下是JSFiddles链接:
这只是测试,你可以在Google Chrome中完成:
导航到:chrome:// flags /#unsafely-treat-insecure-origin-as-secure
然后你会看到:
输入您想允许的地址,然后启用并重新启动您的浏览器。
是的,在版本50中,Google Chrome已经弃用了该功能。如果您在chrome中尝试使用它,则会出现以下错误:
getCurrentPosition()和watchPosition()在不安全的源上已被弃用。为使用此功能,您应考虑将应用程序切换到安全来源,例如HTTPS。有关更多详细信息,请参见https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins。
所以,您需要添加SSL证书。这是唯一的方法。
而且现在使用Let's Encrypt相当容易。这里是指南
对于测试目的,您可以尝试以下内容:
1. localhost在HTTP上被视为安全来源,因此如果您能够从localhost运行服务器,则应该能够在该服务器上测试该功能。
2. 您可以使用--unsafely-treat-insecure-origin-as-secure =“http://example.com”标志(将“example.com”替换为实际要测试的来源),这将在此会话中将该来源视为安全。请注意,您还需要包括--user-data-dir=/test/only/profile/dir来创建一个新的测试配置文件,以使标志起作用。
我认为Firefox也限制了用户从http
访问GeoLocation API请求。这是WebKit的更新日志:https://trac.webkit.org/changeset/200686
curl ipinfo.io
{
"ip": "172.56.39.47",
"hostname": "No Hostname",
"city": "Oakland",
"region": "California",
"country": "US",
"loc": "37.7350,-122.2088",
"org": "AS21928 T-Mobile USA, Inc.",
"postal": "94621"
}
getCurrentPosition()
获得的匹配:$.getJSON('https://ipinfo.io/geo', function(response) {
var loc = response.loc.split(',');
var coords = {
latitude: loc[0],
longitude: loc[1]
};
});
以下是一个详细的示例,展示了如何将其作为getCurrentPosition()
的备用方案:
function do_something(coords) {
// Do something with the coords here
}
navigator.geolocation.getCurrentPosition(function(position) {
do_something(position.coords);
},
function(failure) {
$.getJSON('https://ipinfo.io/geo', function(response) {
var loc = response.loc.split(',');
var coords = {
latitude: loc[0],
longitude: loc[1]
};
do_something(coords);
});
};
});
请参见http://ipinfo.io/developers/replacing-navigator-geolocation-getcurrentposition以获取更多细节。
chrome --unsafely-treat-insecure-origin-as-secure="http://localhost:8100" --user-data-dir=C:\testprofile
/usr/bin/open -n "/Applications/Google Chrome.app" --args "http://localhost:8100" --unsafely-treat-insecure-origin-as-secure="http://localhost:8100" --user-data-dir=/tmp/testprofile
- HugoHTTP 中发生了错误。
在下方的标签中为localhost设置权限(接受这些 HTTP 引用网站的请求)。
对我有效。
我知道geoLocation API更好,但对于无法使用SSL的人,您仍然可以使用某些服务,例如geopluginService。
根据文档,您只需向服务URL发送带有IP的请求http://www.geoplugin.net/php.gp?ip=xx.xx.xx.xx
,输出是一个序列化数组,因此在使用之前必须进行反序列化。
请记住,该服务不如geoLocation准确,但仍然是一种简单快捷的解决方案。
如果您想在开发环境中测试,请使用 FireFox
或其他浏览器,而不是 Chrome
。对于生产环境,除了使用 https
之外别无选择。
对于开发环境,只需在 FireFox 中打开 http://localhost:8100/
,就不会出现此类错误。