缺少CORS标题"Access-Control-Allow-Origin"

imm*_*odi 52 ajax jquery json jsonp cors

我从我的asp.net表单中调用此函数,并在调用ajax时在firebug控制台上收到以下错误.

跨源请求已阻止:同源策略禁止在http://anotherdomain/test.json中读取远程资源.(原因:缺少CORS标题'Access-Control-Allow-Origin').

var url= 'http://anotherdomain/test.json';
        $.ajax({
            url: url,
            crossOrigin: true,
            type: 'GET',
            xhrFields: { withCredentials: true },
            accept: 'application/json'
        }).done(function (data) {
            alert(data);                
        }).fail(function (xhr, textStatus, error) {
            var title, message;
            switch (xhr.status) {
                case 403:
                    title = xhr.responseJSON.errorSummary;
                    message = 'Please login to your server before running the test.';
                    break;
                default:
                    title = 'Invalid URL or Cross-Origin Request Blocked';
                    message = 'You must explictly add this site (' + window.location.origin + ') to the list of allowed websites in your server.';
                    break;
            }
        });
Run Code Online (Sandbox Code Playgroud)

我已经做了替代方式,但仍无法找到解决方案.

注意:我没有服务器权限来进行服务器端(API/URL)更改.

538*_*MEO 50

当您尝试访问其他域的资源时,通常会发生这种情况.

这是一个安全功能,可以避免每个人自由访问该域的任何资源(可以访问该域,例如在盗版域上拥有完全相同的网站副本).

响应的标题,即使它是200OK也不允许其他来源(域,端口)访问资源.

如果您是两个域的所有者,则可以解决此问题:

解决方案1:通过.htaccess

要更改它,您可以在请求的域文件的.htaccess中写入:

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    </IfModule>
Run Code Online (Sandbox Code Playgroud)

解决方案2:以正确的方式设置标头

如果将其设置为所请求文件的响应头,则允许每个人访问资源:

Access-Control-Allow-Origin : *
Run Code Online (Sandbox Code Playgroud)

要么

Access-Control-Allow-Origin : http://www.my-domain.com
Run Code Online (Sandbox Code Playgroud)

和平与代码;)

  • Jeff:确保在服务器配置中启用了mod_headers模块.正如您所注意到的,gkubed的答案取决于IfModule测试.实际上,最好的方法是不将它包装在此测试中,因此如果您的服务器上没有此模块,则会引发错误. (2认同)

Gha*_*iya 11

服务器端将其置于以下之上<filename>.php

header('Access-Control-Allow-Origin: *');
Run Code Online (Sandbox Code Playgroud)

您可以设置特定域限制访问:

header('Access-Control-Allow-Origin: https://www.example.com');
Run Code Online (Sandbox Code Playgroud)


Peg*_*zza 6

在您的ajax请求中,添加:

dataType: "jsonp",
Run Code Online (Sandbox Code Playgroud)

后行:

type: 'GET',
Run Code Online (Sandbox Code Playgroud)

应该解决这个问题..

希望这能帮助你

  • 这不是一个有保证的修复,只有在接收域配置为以JSONP格式响应时才会*有效.如果域没有启用CORS,则JSONP极不可能正常工作.另请注意,JSON和JSONP不可互换. (4认同)