Javascript 否';访问控制允许原点';标题已存在。因此,不允许“源”访问

Javascript 否';访问控制允许原点';标题已存在。因此,不允许“源”访问,javascript,http,cors,mediawiki,mediawiki-api,Javascript,Http,Cors,Mediawiki,Mediawiki Api,编辑:没有JSONP!是的,我知道CORS由服务器处理,是的,服务器确实支持它。问题在我这边 我正在尝试从浏览器中使用MediaWiki API。我正在通过XMLHttpRequest发送GET请求,但由于CORS问题,它无法工作。收到响应后,我的浏览器将显示以下消息: 无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“” 我理解为什么我会遇到这个问题,但我不知道如何从浏览器/JavaScript方面解决它

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

我正在尝试从浏览器中使用MediaWiki API。我正在通过XMLHttpRequest发送GET请求,但由于CORS问题,它无法工作。收到响应后,我的浏览器将显示以下消息:

无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”

我理解为什么我会遇到这个问题,但我不知道如何从浏览器/JavaScript方面解决它

代码:

我尝试过的一些事情:

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>
如前所述,您在请求中传递的
origin
参数和您的浏览器在AJAX调用中发送的
origin
头应该匹配,并且它必须匹配外部wiki上
$wgCrossSiteAJAXdomains
中的一个值。由于您的源站(或您的本地主机:8000)在
$wgCrossSiteAJAXdomains
中不可用,MediaWiki API将永远不会在响应中发送
访问控制允许源站
头,任何CORS请求都将失败,并出现您在浏览器控制台中看到的错误

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

MediaWiki API在Wikimedia站点上用于执行诸如允许映像之类的操作 从手机上的维基百科网站直接上传到Commons 接口

此API不用于任何主机的公共消费,它只用于一组经过验证的主机

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

当前无法执行您想要的操作,因为存在允许CORS的源服务器端白名单,并且您的服务器不在白名单上

目前,MediaWiki中没有用于无身份验证CORS的选项,因此白名单将应用于所有CORS请求,无论它们是否包含身份验证


请参阅和

可能重复的,这样我就因为问了一个有效的问题而被否决了?“重复”问题给出了一些解决方案,比如使用JSONP,这不是我想要的。其他答案说设置标题或是明显错误。为了重新迭代,我不想使用JSONP。最佳答案链接到使用XDomainRequest()而不是XMLHttpRequest()的博客。经过比较,似乎需要XDomainRequest()来实现CORS兼容性。然后,在“重复”问题中没有一个答案是有效的。JSONP没有解决这个问题,它只是绕过了CORS问题。MediaWiki支持CORS,所以我不知道为什么我会遇到这个浏览器问题。有没有一种无JSONP的方法来处理这个CORS问题?从我所读到的内容来看,这似乎是一种绕过问题而不真正解决问题的黑客方式。CORS唯一的问题是他们不发布CORS头,您希望他们知道JSONP也不是一个解决方案,因为回调参数没有记录在他们的APIi中。我已经做了,它不起作用。我尝试设置了许多http头,但没有一个解决了这个问题。以上面的代码为例进行了编辑。这是因为我在这里提到CORS之前就尝试过它,但它不起作用。但是CORS的问题不是我的浏览器实现的安全问题吗?为什么有一个允许CORS的源服务器端白名单?根据我对CORS的理解,我的浏览器向a发送请求,但响应是从B发送的,因此它不接受要读取的响应。我误解了这个问题吗?但是CORS的问题不是我的浏览器实现的安全问题吗?为什么有一个允许CORS的源服务器端白名单?根据我对CORS的理解,我的浏览器向a发送请求,但响应是从B发送的,因此它不接受要读取的响应。我是不是误解了这个问题?不是。CORS是关于跨域请求的。由于同源策略,域A中的脚本无法对域B进行AJAX调用。CORS放宽了这一限制,以便域A脚本可以调用域B,但由域B响应该请求。如果B信任A,则它将发送
访问控制允许-*
标题,浏览器可以处理响应。另一方面,如果B不知道A,它将不会发送CORS特定的头,浏览器将抛出一个错误
<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>
$.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
})