CORS 在 Firefox 中不起作用

Posted

技术标签:

【中文标题】CORS 在 Firefox 中不起作用【英文标题】:CORS not working in Firefox 【发布时间】:2015-03-16 19:14:03 【问题描述】:

我正在尝试通过 ajax 将数据加载到 jQuery 对话框中,但在 Firefox (34.0.5) 中请求失败。工作正常,我在 Chrome 和 Safari 中没有收到任何投诉。

我的 apache conf 包含:

Header set Access-Control-Allow-Origin "*" 
Header set Access-Control-Allow-Methods: "PUT, GET, POST, DELETE, OPTIONS"
Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"

jQuery 很简单:

$('#dialog').load('example.php', function()  $('#dialog').dialog('open'); );

Firefox 响应以下控制台错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://www.example.com/example.php. This can be fixed by moving the resource to the same domain or enabling CORS.

检查来自 ajax 请求的响应标头,它们似乎都完好无损,并且与 apache 中声明的内容一致。我是否应该包含其他指令或以某种方式更改配置才能使其正常工作?

更新:问题的根源在于我希望example.comwww.example.com 的功能相同。在这两种情况下,有问题的站点在标题 <base href="www.example.com" /> 中始终有一个标签,因为这是默认站点框架的一部分。从那以后,我发现删除此链接允许 ajax 请求在 example.com 上工作,即使它仍然专门从 www 子域调用资源。

有趣的是,删除此标记后,请求和响应标头的许多方面都会发生变化。对于任何可能对此处的含义有所了解的人,我将在下面粘贴请求和响应标头。

这里是删除了<base> 标记的标题。在这种情况下,ajax 调用成功:

回复

    HTTP/1.1 200 OK
    Date: Sun, 18 Jan 2015 22:11:04 GMT
    Server: Apache/2.4.7 (Ubuntu)
    X-Powered-By: PHP/5.5.9-1ubuntu4.5
    Set-Cookie: PHPSESSID=xxx; path=/; HttpOnly
    language=en; expires=Tue, 17-Feb-2015 22:11:04 GMT; Max-Age=2592000; path=/; domain=www.example.com
    currency=CAD; expires=Tue, 17-Feb-2015 22:11:04 GMT; Max-Age=2592000; path=/; domain=www.example.com
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public
    Pragma: no-cache
    Content-Encoding: gzip
    access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS
    access-control-allow-origin: *
    access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept
    Content-Length: 1515
    Connection: close
    Content-Type: text/html; charset=utf-8

请求

    GET /example.php HTTP/1.1
    Host: www.example.com
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:34.0) Gecko/20100101 Firefox/34.0 FirePHP/0.7.4
    Accept: text/html, */*; q=0.01
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Referer: http://example.com/
    Origin: http://example.com
    x-insight: activate
    Connection: keep-alive
    Cache-Control: max-age=0

这里是带有<base> 标记的标头。这些标头反映了 ajax 调用失败的情况。值得注意的是,响应标头中的“位置”字段显示“https”,即使这不是通过 https 连接发生的:

回复

    HTTP/1.1 302 Found
    Date: Sun, 18 Jan 2015 22:12:26 GMT
    Server: Apache/2.4.7 (Ubuntu)
    X-Powered-By: PHP/5.5.9-1ubuntu4.5
    Set-Cookie: PHPSESSID=xxx; path=/; HttpOnly
    language=en; expires=Tue, 17-Feb-2015 22:12:26 GMT; Max-Age=2592000; path=/; domain=www.example.com
    currency=CAD; expires=Tue, 17-Feb-2015 22:12:26 GMT; Max-Age=2592000; path=/; domain=www.example.com
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public
    Pragma: no-cache
    Status: 302
    Location: https://www.example.com/index.php
    access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS
    access-control-allow-origin: *
    access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept
    Content-Length: 0
    Connection: close
    Content-Type: text/html

请求

    OPTIONS /example.php HTTP/1.1
    Host: www.example.com
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:34.0) Gecko/20100101 Firefox/34.0 FirePHP/0.7.4
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Origin: http://example.com
    Access-Control-Request-Method: GET
    Access-Control-Request-Headers: x-requested-with
    x-insight: activate
    Connection: keep-alive
    Cache-Control: max-age=0

【问题讨论】:

CORS 标头是否被发送了两次?我最近遇到了一个问题,我错误地将它添加到我的 htaccess 以及我的 apache conf 中。这导致标头值被发送两次,从而导致某些浏览器无法正常工作。 我看不到。我没有在 .htaccess only apache vhost conf 中设置任何内容 - 尽管认为如果您使用 Header add 而不是 Header set 也可能发生这种情况。就目前而言,我只在响应标头中看到它们一次。 我遇到了类似的问题(这适用于 Chrome,不适用于 FF)但没有使用 标签。 【参考方案1】:

根据MDN,您不能将通配符用于“凭据请求”,因此您的请求可能属于该类别。

【讨论】:

以上是关于CORS 在 Firefox 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的动画在 Firefox 中不起作用?

为啥动画内容在 Firefox 中不起作用?

按钮:悬停在 Firefox 中不起作用

渐变在 Chrome 中不起作用,但在 Firefox 中起作用

calc() 在 Firefox 中不起作用

CORS 在 Django 中不起作用,但设置似乎正确