【问题标题】:Firefox 'Cross-Origin Request Blocked' despite headers [closed]尽管有标头,但 Firefox '跨源请求被阻止'[关闭]
【发布时间】:2014-08-13 20:04:11
【问题描述】:

我正在尝试发出一个简单的跨域请求,而 Firefox 一直以这个错误阻止它:

跨域请求被阻止:同源策略不允许读取 [url] 处的远程资源。这可以通过将资源移动到同一域或启用 CORS 来解决。 [网址]

它在 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 之外的所有浏览器。有人可以帮忙吗?

【问题讨论】:

  • 您能否提供所有请求和响应的完整跟踪?或者至少提供一个测试站点?如果网站访问远程源http、https、文件? mozSystem 不支持仅打包 firefox-os 应用程序的常规网站,因此请放弃该选项。
  • @nmaier 以 POST 而非 GET 形式发送时的标头:Accept application/json, text/plain, */*Accept-Encoding gzip, deflateAccept-Language en-US,en;q=0.5Content-Length 35Content-Type application/x-www-form-urlencoded; charset=UTF-8Content-Type application/x-www-form-urlencoded; charset=UTF-8Host [url]Host [url]Origin [url]Referer [referrer url]987654333333333 错误: @
  • @nmaier 实际上,这似乎是我正在访问的网站上的安全证书的某种问题——Firefox 只是给出了一个虚假的错误。如果我将该站点添加到例外列表中,它可以正常工作。

标签: javascript firefox cors cross-domain


【解决方案1】:

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

【讨论】:

  • 刚刚遇到这个问题,错误太笼统,而且 Chrome 和 Firefox 使用不同的证书存储,因此更难调试。我应该怀疑当我的代理没有捕获任何 OPTIONS 请求时(它在 SSL 握手时中断)。
  • Godwhacker,也许我遇到了同样的问题。你是怎么发现它是安全证书的?你在哪里可以看到这个?
  • 在我的情况下,我有一个 Angular 应用程序调用另一台服务器,两者都使用内部签名的证书。但是,Firefox 不会自动信任该证书,因为它未被公共机构认可。因此,在此问题消失之前,我需要确保将两台服务器的证书作为例外添加到 Firefox 中。
  • 对我来说,解决方法是在 XHR 实例上设置 withCredentials=true;否则 Firefox 在发出请求时无法使用客户端证书(但在 Chrome 中运行良好)。
  • @SamStorie 的评论听起来更像是答案而不是这个答案。谢谢
【解决方案2】:

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

我的解决方案是这篇文章

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

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

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

起初它看起来像是挂在xhr.send()上。但后来我发现它并没有得到这个声明。我在它前面放了另一个console.log,但没有到达那里——即使最后一个console.log 和新的console.log 之间没有任何东西。它刚刚停在两个console.log 之间。

重新排列行,删除,看看文件中是否有任何奇怪的字符。我什么也没找到。

重启 Firefox 解决了这个问题。

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

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

【讨论】:

  • 今天对我来说同样的故事,基本上。重新启动 Firefox 修复了它。 5 年后。
【解决方案3】:

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

如果你想用https连接到一个跨域,你必须先为这个证书添加一个例外。

您可以通过访问被阻止的链接一次并添加异常来做到这一点。

【讨论】:

  • 这对访问您网站的任何人都没有特别的帮助,除非您很乐意在上面留言说“如果您使用的是 Firefox,请访问此网站并将其添加到您的例外的
  • @Cracker0dks “访问被阻止的链接一次并添加异常”你能详细说明在哪里添加异常吗?我正在使用 Firefox Quantum。 TIA
  • 您浏览到 Firefox 直接抱怨的链接。然后你会收到证书警告。允许证书。再次访问您的主站点。
【解决方案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 配额会很快被消耗掉。

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

【讨论】:

  • 请不要多次发布相同的答案。请确保您的回答确实回答了问题。如果您需要在其他地方指导某人以获取更多信息,这不是一个好的答案。
  • 您好,我使用了该链接,因为它包含更多信息,例如先决条件等。如果你觉得它合适,我会删除它。
【解决方案5】:

只需添加

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

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

【讨论】:

  • 如果你想设置它接受来自任何地方的请求,那很好;如果你不这样做就不好了,这是标题的全部内容。
【解决方案6】:

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

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

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

【讨论】:

    【解决方案7】:

    对我来说,事实证明我将 Access-Control-Allow-Origin 响应标头设置为特定(并且正确)host.com,但它必须返回为 http://host.com。火狐是做什么的?它默默地吞下 GET 请求并将状态 0 返回到 XHR,没有警告输出到 javascript 控制台,而对于其他类似的故障,它至少会说些什么。哎哎。

    【讨论】:

    • 似乎该方案是预期的,查看w3.org/TR/cors 的示例,但无论如何谢谢,我也做错了,是的,缺少 Firefox 错误消息。
    【解决方案8】:

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

    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]
      

    【讨论】:

      【解决方案9】:

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

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

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

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

          我遇到了类似的问题,我认为注册我的解决方法是有效的:

          我有一个基本上基于 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】:

            如果您没有“真实”证书(因此使用自签名证书),在 Firefox 中您可以访问:

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

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

            【讨论】:

            • 这对我有用,当我的 CORS 在除 Firefox 之外的所有其他浏览器中工作时出现错误 -> Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at localhost:44304/v1/search. (原因:CORS 请求未成功)。
            • @Hypenate:感谢您的解决方案。它解决了 Firefox 的问题。但它不适用于任何移动浏览器。你能帮我解决这个问题吗?
            【解决方案13】:

            我发现 Firefox 中的请求被以下消息阻止时遇到了这个问题:

            原因:CORS 请求未成功

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

            如果您在摸不着头脑后遇到这个问题,请尝试检查您安装了哪些扩展程序,看看它们中是否有任何阻塞请求。

            详情请参阅 MDN 上的Reason: CORS request did not succeed

            【讨论】:

            • 您如何确定是哪个扩展程序阻止了请求?我遇到了同样的问题,因为请求在具有新配置文件的 Firefox 中成功(所以没有扩展)
            • 我单击了每个扩展程序以查看是否有任何提及阻止我遇到问题的特定站点的内容。 Ghostery 有一个条目,所以我将站点标记为受信任,重新加载页面,请求成功。
            • 谢谢!我还发现了扩展 Project Insight,它概述了所有扩展的权限。 addons.mozilla.org/en-US/firefox/addon/project-insight
            • @awendt Oof。隐私獾也适合我。谢谢。
            • 在我的情况下,我打开了 Firefox 增强跟踪保护,然后我为我信任的网站(开发网站)删除了它,它修复了我遇到的错误。唷,我以为我们已经破坏了 Firefox 的网站:-/
            【解决方案14】:

            如果上述答案没有帮助,请检查后端服务器是否启动并运行,因为在我的情况下,服务器崩溃了,这个错误被证明是完全误导的。

            【讨论】:

              【解决方案15】:

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

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

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

              【讨论】:

              • 就我而言,在 Firefox 开发者控制台中启用 XHR 消息后,我看到请求被插件阻止。事实上,facebook 容器插件按钮上有一个感叹号。我必须“允许 facebook 容器中的网站”才能使其正常工作。我不得不说我的 URL 请求是对 facebook 基本显示 API 的请求,希望它对某人有所帮助。
              【解决方案16】:

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

              在浪费了很多时间之后,我们发现使用 Kaspersky Total Control 的用户的请求被阻止了。

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

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

              好消息是您可以检测到此类被阻止的请求。错误是空的——它没有状态和响应。这样您就可以假设它被第三方软件阻止并显示一些信息。

              【讨论】:

                【解决方案17】:

                当我的请求处理时间超过 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

                【讨论】:

                  猜你喜欢
                  • 2020-07-09
                  • 2015-08-10
                  • 1970-01-01
                  • 2018-06-28
                  • 2021-07-30
                  • 2016-08-22
                  • 2016-01-29
                  • 1970-01-01
                  相关资源
                  最近更新 更多