AWS EC2 HTTP环境调用Geolocation API定位失败问题咨询
你遇到的定位失败问题完全由HTTP协议的安全上下文限制导致。
现代浏览器针对Geolocation、摄像头/麦克风调用、剪贴板读写这类敏感API,强制要求只能在安全上下文环境中调用,安全上下文仅包含两类场景:
- 本地开发环境,即域名为
localhost或127.0.0.1的场景,这也是你本地调试正常的原因 - 基于HTTPS协议加载的站点
你把项目部署到EC2后,通过公网IP+HTTP访问站点,不属于浏览器认可的安全上下文,浏览器会直接静默拒绝定位权限请求,不会弹出授权弹窗,直接返回PERMISSION_DENIED错误码,和你描述的现象完全匹配。
以下方案均不需要购买域名、不需要申请公开可信的SSL证书,完全满足个人测试需求:
方案1:浏览器启动参数放行(最快,仅个人本地测试用)
完全退出测试用的Chrome/Edge浏览器(确保后台进程全部关闭),找到浏览器快捷方式,右键打开「属性」,在「目标」栏原有内容末尾加空格后追加以下参数:--unsafely-treat-insecure-origin-as-secure="http://你的EC2公网IP:服务端口"举个例子,如果EC2公网IP为
1.2.3.4,服务运行在80端口,追加内容为--unsafely-treat-insecure-origin-as-secure="http://1.2.3.4"即可。保存后通过该快捷方式启动浏览器,访问站点就会正常弹出定位授权弹窗,功能和HTTPS环境完全一致。方案2:配置自签名SSL证书(一劳永逸,支持多设备测试)
直接在EC2实例上生成自签名证书,给服务加上HTTPS支持即可:- 登录EC2执行以下命令生成有效期10年的自签名证书:
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \ -keyout /etc/ssl/private/selfsigned.key \ -out /etc/ssl/certs/selfsigned.crt \ -subj "/CN=填写你的EC2公网IP"- 配置你使用的Web服务(Nginx、Caddy或者直接给Node服务配置证书均可)监听443端口,加载上述生成的证书和私钥文件。
- 首次访问时浏览器会提示连接不安全,点击「高级」-「继续访问」即可,进入站点后Geolocation API可正常调用,无功能限制。
方案3:修改浏览器实验性配置(无需改快捷方式)
打开Chrome/Edge地址栏输入chrome://flags/#unsafely-treat-insecure-origin-as-secure,在配置项的输入框中填入你的EC2站点HTTP地址,将右侧选项改为Enabled,点击重启浏览器按钮即可生效。
注意:以上方案仅适用于个人测试场景,正式对外提供服务的站点必须使用合法CA签发的SSL证书,通过HTTPS协议访问,不要在生产环境使用上述绕过方式。
内容的提问来源于stack exchange,提问作者Prithvi Emmanuel Machado

