缺少CORS标头“ Access-Control-Allow-Origin”


72

我从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;
            }
        });

我已经做了另一种方法,但是仍然找不到解决方案。

注意:我没有更改服务器端(API / URL)的服务器权限。


1
是否anotherdomain支持jsonp?否则,读这两份线程stackoverflow.com/questions/20035101/...
帕特里克·墨菲

@PatrickMurphy,不anotherdonain,不支持CORS。我收到title = 'Invalid URL or Cross-Origin Request Blocked';消息。
immayankmodi 2015年

jsonp允许您传递某种回调参数,该参数允许您在不使用json封装数据的情况下接收cors
Patrick Murphy

@PatrickMurphy,能给我看看一个可行的例子吗?因为我尝试了一切对我来说都是可能的。不知道为什么它不起作用?
immayankmodi 2015年

我们需要知道您尝试联系的api,jsonp规范将在其文档中
Patrick Murphy

Answers:


63

当您尝试访问另一个域的资源时,通常会发生这种情况。

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

响应的标头(即使为200OK)也不允许其他来源(域,端口)访问资源。

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

解决方案1:通过.htaccess

要更改此设置,您可以将其写入请求的域文件的.htaccess中:

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    </IfModule>

如果您只想授予对一个域的访问权限,则.htaccess应该如下所示:

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin 'https://my-domain.tdl'
    </IfModule>

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

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

Access-Control-Allow-Origin : *

要么

Access-Control-Allow-Origin : http://www.my-domain.com

和平与守则;)


@SébastienGarcia-Roméo,您好,我已将其添加到我的.htaccess文件中,但仍收到相同的“跨源请求被阻止:同源策略禁止在...处读取远程资源”的问题。你知道那会是什么吗?谢谢
Jeff

这可能是很多事情...最好是在可能的情况下将请求的媒体放在同一服务器上...
grobouDu06 '02

2
杰夫:确保在服务器配置中启用了mod_headers模块。如您所见,gkubed的答案受IfModule测试。实际上,最好的方法是不要将其包装在此测试中,因此如果服务器上不提供此模块,则会引发错误。
法比恩·哈达迪

1
答案中的重点非常令人赞赏。这些标头放在“请求的域”上(相对于其他标头)是我的关键。
yodarunamok

1
应该是Correct Answer我尝试过的<IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule>,它就像一种魅力:)
Jodyshop,

6

在您的ajax请求中,添加:

dataType: "jsonp",

下一行:

type: 'GET',

应该解决这个问题..

希望这对你有帮助


7
这不是保证的修复程序,在将接收域配置为以JSONP格式响应时才有效。如果该域未启用CORS,则JSONP不太可能工作。另请注意,JSON和JSONP不可互换。
罗里·麦克罗森

@RoryMcCrossan接收域应如何响应JSONP?(我正在使用PHP。)我进行了一些搜索,但没有找到太多。我认为我的问题可能与WAF(Web应用程序防火墙)更为相关,但是我想知道JSONP是否可以以某种方式打开解决方法。
PJ Brunet

3

服务器端将此放在.php之上:

 header('Access-Control-Allow-Origin: *');  

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

header('Access-Control-Allow-Origin: https://www.example.com')

2

您必须修改服务器端代码,如下所示

public class CorsResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,   ContainerResponseContext responseContext)
    throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin","*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");

  }
}

11
哦,是的,盲目地告诉某人在生产环境中启用该设置。好点子。
魔术章鱼缸

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.