Firefox 'Cross-Origin Request Blocked' despite headers

I'm trying to make a simple cross-origin request, and Firefox is consistently blocking it with this error:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at [url]. This can be fixed by moving the resource to the same domain or enabling CORS. [url]

It works fine in Chrome and Safari.

As far as I can tell I've set all the correct headers on my PHP to allow this to work. Here's what my server is responding with

HTTP/1.1 200 OK
Date: Mon, 23 Jun 2014 17:15:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Vary: Accept-Encoding
Content-Length: 186
Content-Type: text/html

I've tried using Angular, jQuery, and a basic XMLHTTPRequest object, like so:

var data = "id=1234"
var request = new XMLHttpRequest({mozSystem: true})
request.onload = onSuccess;
request.open('GET', 'https://myurl.com' + '?' + data, true)
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
request.send()

...and it works in every browser except Firefox. Can anyone help with this?

324078 次浏览

原来这和 CORS 没有关系,是安全证书的问题。误导性错误 = 4小时的头痛。

只是一句警告,我终于解决了 Firefox 和 CORS 的问题。

我的解决办法就是这个帖子

在 Apache 上设置 CORS (跨来源资源共享) ,使用正确的响应头允许所有事情通过 | Benjamin Horn

然而,Firefox 在 Apache 服务器上设置了这些头文件(在.htaccess 文件夹中)之后,表现得非常非常奇怪。

我添加了很多 console.log("Hi FF, you are here A")等,看看是怎么回事。

一开始它看起来像是挂在 xhr.send()上的。但后来我发现它没有达到这个声明。我把另一个 console.log的权利之前,没有到达那里-即使有什么之间的最后一个 console.log和新的。它刚刚停在两个 console.log之间。

重新排序行,删除,看看文件里有没有奇怪的字符,我什么都没找到。

重启 Firefox 解决了这个问题。

是的,我应该装个窃听器。只是它太奇怪了,所以不知道如何复制它。

注意 : 而且,哦,我只做了 Header always set的部分,而不是 Rewrite*的部分!

我发现我的问题是,我发送交叉请求的服务器有一个不受信任的证书。

如果要使用 https连接到跨域,必须首先为此证书添加一个异常。

可以通过访问一次被阻塞的链接并添加异常来实现这一点。

这些文件是不言自明的。创建一个文件,可以随意命名它。在我的例子中是 jq2.php。

<html>
<head>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
// document is made ready so that the program starts when we load this page
$(document).ready(function(){


// it tells that any key activity in the "subcat_search" filed will execute the query.
$("#subcat_search").keyup(function(){


// we assemble the get link for the direction to our engine "gs.php".
var link1 = "http://127.0.0.1/jqm/gs.php?needle=" + $("#subcat_search").val();


$.ajax({
url: link1,
// ajax function is called sending the input string to "gs.php".
success: function(result){
// result is stuffed in the label.
$("#search_val").html(result);
}
});
})


});
</script>
</head>


<body>


<!-- the input field for search string -->
<input type="text" id="subcat_search">
<br>
<!-- the output field for stuffing the output. -->
<label id="search_val"></label>


</body>
</html>

现在我们将包含一个引擎,创建一个文件,可以随意命名它,在我的例子中是 gs.php。

$head = "https://maps.googleapis.com/maps/api/place/textsearch/json?query="; //our head
$key = "your key here"; //your key
$hay = $_GET['needle'];


$hay = str_replace(" ", "+", $hay); //replacing the " " with "+" to design it as per the google's requirement
$kill = $head . $hay . "&key=" . $key; //assembling the string in proper way .
print file_get_contents($kill);

我尽量使这个例子尽可能简单。而且因为它在每次按键时都执行链接,所以 API 的配额会消耗得非常快。

当然,我们可以做的事情没有止境,比如将数据放入表中,发送到数据库等等。

只要加上

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

到你要连接的网站根目录下的 .htaccess文件。

两天后我找到了解决办法:。

重要提示: 在响应凭据请求时,服务器必须 指定域,并且不能使用通配符。

Https://developer.mozilla.org/en-us/docs/web/http/access_control_cors#requests_with_credentials

对我来说,原来我是设置 Access-Control-Allow-Origin响应头到一个特定的(和正确的) host.com,但它必须作为 http://host.com返回。Firefox 是做什么的?它静默地接受 GET 请求,并将状态0返回给 XHR,没有警告输出到 javascript 控制台,而对于其他类似的失败,它至少会说些什么。哎哎。

试试这个,应该能解决你的问题

  1. 在 config.php 中,在 domain.com 中添加 www pre,例如:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
    
  2. Add this to your .htaccess file

    RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
    

为了后代,还要检查服务器日志,看看被请求的资源是否返回了200。

我遇到了一个类似的问题,在飞行前 Ajax 请求中返回了所有正确的标题,但是浏览器报告实际的请求由于 CORS 标题错误而被阻塞。

原来,被请求的页面由于错误代码而返回了500错误,但只有在通过 CORS 获取时才会返回。浏览器(Chrome 和 Firefox)错误地报告说访问控制-允许-起源标题丢失,而不是说页面返回了500。

要进行调试,请尽可能检查服务器日志。 Firefox 在控制台中返回 CORS 错误的原因有很多。

其中一个原因也是 uMatrix (我猜也是 NoScript 和类似的)插件。

我也遇到过类似的问题,我认为我解决这个问题的方法是正确的:

我有一个基本上建立在 Symfony 3之上的系统。出于自学和性能方面的考虑,我决定使用 GoLang 编写一些脚本,这也是一个具有公共访问权限的 API。

我的 Go API 期望 Json 格式参数,并返回 Json 格式响应

为了调用这些 GoApi,我使用了大多数的 $. ajax (jQuery) 第一个测试是一个骗局: (联合国)著名的“跨源请求阻止”弹出! 然后,我试着在 apache conf,htaccess,php,javascript 和任何我能在 google 上找到的地方设置“ Access-Control-allow-Origin: *”!

但是,甚至,同样令人沮丧的错误! ! !

解决办法很简单: 我必须发出“ POST”请求而不是“ GET”。

为了达到这个目的,我不得不同时调整 GoLang 和 JavaScript 来使用 GET! 一旦它完成,没有更多的交叉起源请求阻止为我! ! !

希望对你有帮助

附注:

我正在使用 apache 和 Vhost,在目录块上我有

  Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

记住: “ *”意味着您将接受来自任何人的请求! (这可能是一种安全缺陷) 在我的例子中,它是 OK 的,因为它将是一个公共 API

PS2: 我的头

响应队长

Access-Control-Allow-Credentials    true
Access-Control-Allow-Headers    Authorization
Access-Control-Allow-Methods    GET, POST, PUT
Access-Control-Allow-Origin http://localhost
Content-Length  164
Content-Type    application/json; charset=UTF-8
Date    Tue, 07 May 2019 20:33:52 GMT

请求标头(469B)

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Content-Length  81
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost:9003
Origin  http://localhost
Referer http://localhost/fibootkt/MY_app_dev.php/MyTest/GoAPI
User-Agent  Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/66.0

如果你没有一个“真正的”证书(因此使用一个自签名的证书) ,在 Firefox 中你可以进入:

Options > Privacy & Security > (scroll to the bottom) View Certificates > Servers > Add Exception...

在那里,填写位置,例如: https://www.myserver:myport

我发现 Firefox 中的请求被屏蔽了:

原因: CORS 请求未成功

揪着我的头发后,我发现一个新安装的火狐扩展,隐私獾,阻止了请求。

如果您在挠头之后才想到这个问题,那么尝试检查一下您安装了哪些扩展,看看它们是否阻塞了请求。

有关详细信息,请参阅 MDN 上的 原因: CORS 请求未成功

如果上述的答案没有帮助,然后检查后端服务器是否正常运行,在我的情况下,服务器崩溃,这个错误结果是完全误导。

在我的情况下,它是我的 挡箭牌!由于某种原因,它在我的本地主机上启用,并在 Firefox 中导致了这个错误。

禁用 它或 卸载插件应该可以解决这个问题。

在您的情况下,它可能不是一个广告拦截器,而是另一个 Firefox 插件。首先在没有插件的情况下匿名测试,以确定是否存在问题,然后系统地禁用插件,直到找到问题所在。

在我的案例中,CORS 错误只发生在带有除小文件以外的文件附件的 POST 请求中。

在浪费了很多小时之后,我们发现对于使用卡巴斯基总控制的用户,请求被阻止了。

其他防病毒或防火墙软件可能会导致类似的问题。卡巴斯基对请求进行了一些安全测试,但是对于使用 SSL EV 证书的网站忽略了这些测试,因此获得这样的证书应该能够很好地解决这个问题。

禁用域名保护有点棘手,所以这里有一些必要的步骤(至于2020年12月) : 设置-> 网络设置-> 管理排除-> 添加-> 域名-> 保存

好在您可以检测到这种被阻塞的请求。错误是空的-它没有状态和响应。这样你就可以假设它被第三方软件屏蔽了,并显示一些信息。

当我的请求处理超过10秒时,UbuntuFirefox 给 CORS 失败错误。

与 CORS 无关,问题在于 ubuntu 的火狐配置。

我已经将 network.notify.change 更新为 false,从而修复了这个问题。


参考文献:

Https://bugzilla.mozilla.org/show_bug.cgi?id=1238377

Https://bugzilla.mozilla.org/show_bug.cgi?id=1235509