我正在运行本地web服务器,它会向一个在我的PC上也运行的ngrok服务器发送XHR请求。
我收到以下错误信息:XMLHttpRequest无法加载http://foo.ngrok.io/。所请求的资源中不存在“Access-Control-Allow-Origin”标头。因此,不允许从源 'http://localhost:3000' 访问。
似乎ngrok的FAQ提到了CORS标头,但只是和基本身份验证有关 - 它没有提到如何设置标头以便我能够在开发过程中测试我的应用程序。
我该如何更改ngrok的CORS选项以允许从localhost加载请求?
更新:不同的用例。寻找此解决方案的赏金:
我收到以下错误信息:
login.php:1 Access to XMLHttpRequest at 'http://localhost/lagin/public/login.php'
from origin 'http://062b-96-230-240-153.ngrok.io' has been blocked by CORS
policy: The request client is not a secure context and the resource is in more-
private address space `local`.
我查看了配置ngrok的CORS头信息,但仍不确定如何进行。当我尝试运行ngrok http -host-header=rewrite 80时,它会显示未定义的头文件。
我看了10到12个YouTube视频,它们都很好地解释了CORS是什么,但解决方法讲得非常差。
我在Windows 10机器上运行虚拟盒子,并创建一个Linux虚拟机。在Linux侧,我正在运行xampp作为本地服务器。
我可以在ngrok上看到我的网站登录页面,但只要我进行axios调用就会出现上述错误。
另外,我在Chrome浏览器中尝试了//flags/#block-insecure-private-network-requests并禁用它。这样做后,我就不再收到错误信息,但网站也无法正常工作。
额外信息:
我与ngrok交谈,他们说:...听起来你的应用程序在ajax请求中正在尝试调用localhost
。您需要调整该调用以确保其通过ngrok路由。
以下是我的操作:
responseData = sendData2('http://localhost/lagin/public/login.php',emailPass);
这里是sendData2(仅为完整性)
function sendData2(url,emailPass){
let bodyFormData = new FormData()
for (const [key, value] of Object.entries(emailPass)) {
//console.log(key,value)
bodyFormData.append(key,value)
}
return axios({
method: 'POST',
url: url,
data: bodyFormData,
headers: {'Content-Type': 'multipart/form-data'}
})
.then(function(response){
return response.data
})
.catch(function(response){
return response
})
}
更新:每次我们隧道连接到ngrok时,我们都会获得一个地址,例如https://2634-96-230-240-153.ngrok.io如果我们将send2()调用更改为
sendData2('http://96-230-240-153.ngrok.io/lagin/public/login.php',emailPass);
它有效,但这需要我每次有新的隧道时更改代码。调整CORS策略是否可以解决这个问题?
--host-header=rewrite
。 - HarlemSquirrelngrok-skip-browser-warning
,可能会导致问题,这些问题看起来是CORS问题,特别是在GET请求中(预检OPTIONS请求将成功,但ngrok返回一个浏览器警告页面作为对GET的响应,当然,这不是你想要的,也不包括Access-Control-Allow-Origin
头部)。 - mway