没有& # 39;Access-Control-Allow-Origin& # 39;头文件存在.因此,不允许访问Ori

No 'Access-Control-Allow-Origin' header is present. Origin is therefore not allowed access

本文关键字:不允许 Ori 因此 访问 Access-Control-Allow-Origin 没有 文件 存在      更新时间:2023-09-26

编辑:无JSONP!是的,我知道CORS是由服务器处理的,是的,服务器支持它。问题在我这边。

我正在尝试从浏览器使用MediaWiki API。我通过XMLHttpRequest发送一个GET请求,但由于CORS问题,它只是不工作。我从浏览器收到响应后得到以下消息:

XMLHttpRequest无法加载https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=Oculus&utf8。请求的资源上没有'Access-Control-Allow-Origin'标头。因此,不允许访问源'http://127.0.0.1:8000'。

我明白为什么我得到这个问题,但我不知道如何从浏览器/JavaScript方面解决它。

代码:

xmlhttp.open("GET","https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=" + subreddit + "&utf8",true);
xmlhttp.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
xmlhttp.send();

我尝试过的一些事情:

xmlhttp.setRequestHeader('Access-Control-Allow-Origin', 'http://localhost');
xmlhttp.setRequestHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
xmlhttp.setRequestHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
xmlhttp.setRequestHeader('Access-Control-Allow-Credentials', true)
xmlhttp.setRequestHeader("Content-Type", "application/json; charset=UTF-8");

并在url中设置参数origin或作为setRequestHeader返回无效/错误的origin,拒绝

可以使用JSONP。

<script src='https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=Oculus&utf8&callback=callbackname'></script>
<script>
    function callbackname(data){
       //you can get response data here
    }
</script>

如果你使用jquery。

$.getJSON('https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=Oculus&utf8&callback=?', function(data){
    //you can get response data here
})

如前所述,您在请求中传递的origin参数和浏览器在AJAX调用中发送的Origin标头应该匹配,并且它必须匹配外部wiki上$wgCrossSiteAJAXdomains中的一个值。由于您的Origin(在您的情况下为http://127.0.0.1:8000或localhost:8000)在$wgCrossSiteAJAXdomains中不可用,MediaWiki API将永远不会在响应中发送Access-Control-Allow-Origin标头,并且任何CORS请求都将失败,您将在浏览器的控制台中看到错误。

另一个需要考虑的重要事实是

MediaWiki API在维基媒体网站上用于做像允许图像这样的事情直接从手机上的维基百科网站上传到共享资源接口。

这个API不供任何主机的公共使用,它只供一组经过验证的主机使用。

如果你想尝试一些CORS请求,你可以从这里使用GitHub API。下面是一个示例笔向GitHub API发出CORS请求,JSON响应被记录到DevTools控制台。

目前不可能做你想做的事情,因为有一个允许CORS的服务器端白名单,而你的服务器不在白名单上。

目前在MediaWiki中没有无授权CORS的选项,因此白名单适用于所有CORS请求,无论它们是否包含授权。

参见https://phabricator.wikimedia.org/T62835和https://www.mediawiki.org/wiki/Manual:CORS