Javascript CORS访问控制允许来源,尽管标题正确

Javascript CORS访问控制允许来源,尽管标题正确,javascript,http-headers,cross-domain,xss,cors,Javascript,Http Headers,Cross Domain,Xss,Cors,我试图在客户端和apache服务的python(django)服务器上使用jQuery(1.7.1)支持的ajax建立简单的跨源资源共享。根据我阅读的所有说明,我的标题设置正确,但我不断收到以下错误: 无法加载XMLHttpRequest。 不允许使用源代码 访问控制允许源 我试图发送的标题(我不确定它是否通过浏览器)是: javascript代码是 var request = $.ajax({ url : "http://myexternaldomain.com/get

我试图在客户端和apache服务的python(django)服务器上使用jQuery(1.7.1)支持的ajax建立简单的跨源资源共享。根据我阅读的所有说明,我的标题设置正确,但我不断收到以下错误:

无法加载XMLHttpRequest。 不允许使用源代码 访问控制允许源

我试图发送的标题(我不确定它是否通过浏览器)是:

javascript代码是

    var request = $.ajax({
        url : "http://myexternaldomain.com/get_data",
        type : "POST",
        dataType : "json",
        crossDomain : true
    });
请注意,
原点
设置正确。服务器使用以下python代码添加头
accesscontrolalloworigin=*

def process_response(self, response):
    if response.has_header('Access-Control-Allow-Origin'):
            return response

    response['Access-Control-Allow-Origin'] = '*'
    return response

def get_orders(request):
    """ Tell worker what to do """
    response_data = {}
    response_data['action'] = 'probe'
    response = process_response(HttpResponse(json.dumps(response_data), mimetype="application/json"))
    return response
如果我直接访问该地址,它似乎确认标头设置正确

Access-Control-Allow-Origin:*
Content-Type:application/json
Date:Thu, 08 Mar 2012 05:06:25 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
但是在跨域设置中,它总是失败(尝试了chrome和firefox)。我已经尝试完全按照问题的选定答案实现代码,但得到了相同的错误

更新

我很确定问题出在服务器端,因为我已经设法让我的ajax调用与另一个启用了CORS的公共服务器一起工作。当我比较从这个公共服务器返回的头文件和从我的服务器返回的头文件时(当我从同一个域进行测试时),我看不到任何可能导致差异的主要差异(见下文)

我排除的一个微妙之处可能很重要,也可能很重要,那就是实际的域是由多个子域组成的amazon域。真正的地址是,请随意探究,看看我做错了什么

来自公共服务器

Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:622
Content-Type:text/html
Date:Thu, 08 Mar 2012 15:33:20 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:Perl/5.8.7, PHP/4.4.0
从我的服务器-(不跨域工作)

您必须实现一个“预发”请求和响应,因为您的情况被视为一个“”请求。只需要原始标题的基本CORS只能具有“application/x-www-form-urlencoded”、“multipart/form data”和“text/plain”的内容类型。由于返回“application/json”,因此不满足此要求

我对Django一无所知,但我发现通过使用。看起来你可以和Django一起


2013-08-11:看来GitHub回购协议已经不在我们身边了。但是Django软件包看起来仍然在

上可用,所以我被访问URL的响应误导了,事实上,问题是在执行ajax请求时,由于csrf保护,我收到了403(仅在firefox而非chrome中显示)错误。

我使用了优秀的库,也遇到了这个问题。对我来说,解决方案是将“接受编码”添加到默认的CORS_ALLOW_HEADERS元组中

很确定浏览器应该会处理飞行前的请求……至少Chrome会。但是服务器必须识别它。他的脚本只通过在每个请求中添加原始标头来响应基本请求。我尝试使请求变得简单,将数据设置为简单字符串,在$.ajax调用中使用纯文本,在python中返回mimetype='text/plain',但仍然会出现相同的错误。我还设法使其与启用公共cors的服务器一起工作,所以我可以很有信心我的问题是服务器端。我不能夸大这个答案的惊人之处。过去,我曾尝试为Json数据启用CORS,但从未成功过。CORS可以像那样易碎。您最好只返回JSON-P。您只发布远程服务器和本地客户端之间最终交换的标题。如果您查看完整的exchange,我相信您将看到一个选项请求以及一个包含访问控制允许方法和访问控制允许标头的响应。噢,伙计,非常感谢。我的
enable\u cors
wrapper围绕着我的
csrf\u豁免
wrapper,需要反转它们。我就像,WTF。。。
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:622
Content-Type:text/html
Date:Thu, 08 Mar 2012 15:33:20 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:Perl/5.8.7, PHP/4.4.0
Access-Control-Allow-Origin:*
Content-Encoding:gzip
Content-Type:text/plain
Date:Thu, 08 Mar 2012 15:32:24 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding