【问题标题】:Access-Control-Allow-Origin: * not working?访问控制允许来源:* 不起作用?
【发布时间】:2012-03-16 15:02:28
【问题描述】:

经典的“访问控制允许来源不允许来源...”问题。两台机器为同一个网站提供内容。当机器 A 通过 jquery 执行 $('#main').load('link_to_resource_on_B') 时,机器 B 使用 mod_python 提供内容,并添加 Access-Control-Allow-Origin: * 标头。但是由于某种原因,这仍然不起作用。我在 Chrome、Safari 和 Internet Explorer 上对此进行了测试。我通过命令行进行了测试以检查响应标头,似乎Access-Control-Allow-Origin: * 成功位于 B 的标头中。见下文。我可能会错过什么?

$ telnet localhost 80
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /tests/python/test/env HTTP/1.1
host: 10.0.1.10 

HTTP/1.1 200 OK
Date: Mon, 27 Feb 2012 02:05:33 GMT
Server: Apache/2.2.20 (Ubuntu)
Access-Control-Allow-Origin: *
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html

【问题讨论】:

  • 是否有客户端设置的自定义标头?自定义标头(或非 GET HTTP 方法)可能会触发预检请求,这需要额外处理。
  • 感谢您的提示,@monsur。你是对的,它是 OPTION 标头,并没有像看起来那样处理。一项小研究还告诉我,我的 jquery 太旧了。较新的 jquery(自 1.5.2 起)故意避免使用客户标头。所以归结为,我升级了我的 jquery,我的头痛就消失了。对于其他患有相同症状的人,此链接为我提供了启蒙的后半部分。 http://remysharp.com/2011/04/21/getting-cors-working/
  • @josh3736,感谢您帮助我格式化我的初始帖子。那是我的第一篇文章。下次知道该怎么做。

标签: mod-python cors


【解决方案1】:

在响应中启用Access-Control-Allow-Origin 标头是不够的。服务器端实现还应该为pre-flight OPTIONS request 提供适当的处理。特别是,必须在 OPTIONS 响应中设置以下 HTTP 标头:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST

考虑将通配符替换为允许访问跨域服务器的域列表。

请记住,Access-Control-Allow-Origin HTTP 标头也必须在以下 GET 和 POST 响应中设置。

在使用非标准 HTTP 标头的情况下,OPTIONS 响应中可能还需要其他 HTTP 标头,例如 Access-Control-Allow-Headers

可以找到解释 CORS 的精彩文章 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 2016-11-10
    • 2015-02-17
    • 2012-04-27
    • 2019-12-12
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多