Firefox' Cross-Origin Request Blocked'尽管标题

时间:2014-06-23 17:22:15

标签: javascript firefox cors cross-domain

我正在尝试制作一个简单的跨源请求,并且Firefox一直使用此错误阻止它:

  

阻止跨源请求:同源策略禁止在[url]读取远程资源。这可以通过将资源移动到同一域或启用CORS来解决。 [url]

它在Chrome和Safari中运行良好。

据我所知,我已经在我的PHP上设置了所有正确的标题以允许它工作。这是我的服务器响应的内容

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

我尝试过使用Angular,jQuery和基本的XMLHTTPRequest对象,如下所示:

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()

...它适用于除Firefox以外的所有浏览器。任何人都可以帮忙吗?

17 个答案:

答案 0 :(得分:95)

原来这与CORS无关 - 这是安全证书的问题。误导性错误= 4小时的头痛。

答案 1 :(得分:15)

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

如果要使用https连接到跨域,则必须先为此证书添加例外。

您可以通过访问阻止的链接一次并添加例外来执行此操作。

答案 2 :(得分:10)

我在2天后找到了解决方案:(。

  

重要提示:在响应凭证请求时,服务器必须   指定一个域,不能使用野外梳理。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

答案 3 :(得分:4)

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

我的解决方案是这篇文章

Setting CORS (cross-origin resource sharing) on Apache with correct response headers allowing everything through | Benjamin Horn

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

我添加了很多console.log("Hi FF, you are here A")等来查看发生了什么。

起初它似乎挂在了xhr.send()上。但后来我发现它没有达到这个说法。我在它之前放置了另一个console.log并且没有到达那里 - 即使最后一个console.log和新的console.log之间没有任何东西。它只停在两个Header always set之间。

重新排序行,删除,以查看文件中是否有任何奇怪的字符。我一无所获。

重新启动Firefox解决了这个问题。

是的,我应该提交一个错误。只是因为它太奇怪所以不知道如何重现它。

通知:哦,我刚刚完成Rewrite*部分,而不是{{1}}部分!

答案 4 :(得分:3)

添加

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

到您尝试连接的网站根目录中的.htaccess文件。

答案 5 :(得分:2)

当我的请求处理时间超过 10 秒时,Ubuntu Firefox 出现 CORS 失败错误。

与 CORS 无关。问题在于 ubuntu firefox 配置。

我已将 network.notify.changed 更新为 false 以解决此问题。


Mozilla 错误参考:

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

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

答案 6 :(得分:1)

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

  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. 将此添加到.htaccess文件

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

答案 7 :(得分:1)

要调试,请尽可能检查服务器日志。出于各种原因,Firefox在控制台中返回CORS错误。

原因之一也是uMatrix(我猜也是NoScript和类似的东西)插件。

答案 8 :(得分:1)

就我而言,这是我的 ADBLOCKER !由于某种原因,它已在我的本地主机上启用,并在Firefox中导致此错误。

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

对于您而言,它可能不是广告拦截器,而是另一个Firefox插件。首先在没有插件的情况下进行隐身测试,以确定是否是问题所在,然后系统地禁用插件,直到找到罪魁祸首为止。

答案 9 :(得分:0)

对我而言,事实证明我将Access-Control-Allow-Origin响应标头设置为特定(和正确的)host.com,但必须将其作为http://host.com返回。 firefox有什么作用?它静默地吞下GET请求并将状态0返回给XHR,没有警告输出到javascript控制台,而对于其他类似的失败,它至少会说些什么。爱艾。

答案 10 :(得分:0)

对于后代,还请检查服务器日志以查看请求的资源是否返回200。

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

结果是,由于错误的代码,所请求的页面返回500错误,但仅当通过CORS提取该页面时。浏览器(Chrome和Firefox)错误地报告缺少Access-Control-Allow-Origin标头,而不是说页面返回了500。

答案 11 :(得分:0)

我遇到了类似的问题,并且我认为可以通过以下方式对其进行注册是有效的:

我有一个基本上基于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! 一旦完成,对我来说不再有跨域请求被阻止了!!!

希望有帮助

PS:

我正在使用Apache和Vhost,在我拥有的目录块中

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

记住:“ *”表示您将接受任何人的请求! (可能是缺乏安全性) 就我而言,可以,因为它将是一个公共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

请求标头(469 B)

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

答案 12 :(得分:0)

如果您没有“真实”证书(因此使用了自签名证书),则可以在FireFox中访问:
选项>隐私和安全>(滚动到底部)查看证书>添加例外。
在那里填写位置,例如:https://wwww.myserver:myport

答案 13 :(得分:0)

我遇到这个问题,发现该消息阻止了Firefox中的请求:

  

原因:CORS请求未成功

拔掉头发后,我发现新安装的Firefox扩展程序Privacy Badger正在阻止请求。

如果在挠头之后遇到此问题,请尝试检查已安装的扩展,以查看其中是否有任何阻止请求的事物。

答案 14 :(得分:0)

如果上述答案无济于事,请检查后端服务器是否已启动并正在运行,就像我的情况一样,该服务器崩溃了,该错误被证明完全具有误导性。

答案 15 :(得分:0)

就我而言,CORS错误仅在带有文件附件(而不是小文件)的POST请求中发生。

经过数小时的浪费,我们发现使用Kaspersky Total Control的用户的请求被阻止了。

其他防病毒软件或防火墙软件也可能引起类似的问题。卡巴斯基针对请求执行了一些安全测试,但对于具有SSL EV证书的网站则省略了这些测试,因此获得此类证书应该可以正确解决此问题。

为您的域禁用保护有些棘手,因此需要执行以下步骤(截至2020年12月):设置->网络设置->管理排除项->添加->您的域->保存

好处是您可以检测到此类被阻止的请求。错误为空-没有状态和响应。这样,您可以假定它已被第三方软件阻止并显示了一些信息。

答案 16 :(得分:-4)

这些文件是不言自明的。制作一个文件,称之为任何东西。在我的情况下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的配额将被快速消耗。

当然,我们可以做的事情没有尽头,例如将数据放入表格,发送到数据库等等。