Firefox尽管标头却“跨域请求被阻止”


118

我正在尝试提出一个简单的跨域请求,而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 2014年

1
@nmaier标头以POST方式发送而不是GET方式发送: Accept application/json, text/plain, */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 35 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host [url] Origin [url] Referer [referrer url] User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0 错误: 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]
Godwhacker 2014年

2
@nmaier实际上,这似乎是我正在访问的网站上的安全证书存在某种问题-Firefox只是给出了一个虚假错误。如果我将该站点添加到例外列表中,则可以正常工作。
Godwhacker 2014年

Answers:


121

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


3
刚遇到这个确切的问题,该错误太笼统了,而且Chrome和Firefox使用不同的证书存储,因此更难以调试。我应该怀疑,当我的代理服务器没有捕获到任何OPTIONS请求时(在SSL握手中中断了)。
Daniel Correia 2014年

4
Godwhacker,也许我也遇到了同样的问题。您如何发现它是安全证书?在哪里可以看到?
狮子座

9
在我的情况下,我有一个角度应用程序使用内部签名的证书调用另一个服务器。但是,Firefox不会自动信任该证书,因为公共机构不认可该证书。因此,在此问题消失之前,我需要确保将这两个服务器的证书添加为Firefox中的例外。
Sam Storie 2015年

3
对我来说,解决方法是withCredentials=true在XHR实例上设置;否则,Firefox在发出请求时无法使用客户端证书(但是在Chrome中可以正常工作)。
克林特·哈里斯

1
@SamStorie发表的评论听起来比这个答案更像答案。谢谢
娜迦,

26

我发现我的问题是我向交叉请求发送的服务器具有不可信的证书。

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

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


5
这对访问您网站的任何人都没有特别的帮助,除非您高兴地在该网站上留言:“如果您使用的是Firefox,请转到该网站并将其添加到例外列表中”
Godwhacker

@ Cracker0dks“访问被阻止的链接一次并添加例外”,您能否详细说明在何处添加例外?我正在使用Firefox Quantum。TIA
Paul

1
您浏览的链接是Firefox正在直接抱怨。然后,您会收到证书警告。允许证书。再次访问您的主站点。
Cracker0dks '18

25

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

原因:CORS请求未成功

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

如果您在挠头之后遇到了这个问题,请尝试检查已安装的扩展,以查看其中是否有阻止请求的扩展。

请参阅原因:有关MDN的CORS请求未成功


您如何确定哪个扩展阻止了请求?我遇到了同样的问题,因为该请求在具有新配置文件的Firefox中成功完成了(因此没有扩展名)
CiprianTomoiagă19年

1
我单击了每个扩展,以查看是否有提及阻止我遇到问题的特定网站的内容。Ghostery有一个条目,因此我将该站点标记为受信任,重新加载了页面,然后请求成功。
编程教授,

1
谢谢!我还发现了Project Insight扩展,它概述了所有扩展的权限。addons.mozilla.org/zh-CN/firefox/addon/project-insight
西普里安·托莫阿格(CiprianTomoiagă),

1
@awendt Oof。隐私Bad也对我来说。谢谢。
詹森·利奇


12

如果您没有“真实”证书(因此使用自签名证书),则在FireFox中,您可以转到:

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

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


当我的CORS在除Firefox以外的所有其他浏览器上都工作时,出现错误->跨域请求被阻止:此同源策略禁止读取localhost:44304 / v1 / search上的远程资源,这对我有用。(原因:CORS请求未成功)。
JGilmartin

5

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

对我来说解决方案是这篇文章

使用正确的响应头在Apache上设置CORS(跨域资源共享),从而允许通过 本杰明·霍恩(Benjamin Horn)

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

我添加了很多其他内容console.log("Hi FF, you are here A")以查看发生了什么。

一开始它看起来像挂了xhr.send()。但是后来我发现它没有达到这个陈述。我console.log在它前面放置了另一个,但没有到达那里-即使在最后一个console.log和新的之间没有任何东西。它只是在两个之间停了下来console.log

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

重新启动Firefox可以解决此问题。

是的,我应该提交一个错误。只是它是如此奇怪,所以不知道如何复制它。

注意:而且,哦,我只是做Header always set零件,而不是Rewrite*零件!


从本质上讲,今天对我来说也是一样。重新启动Firefox修复了它。超过5年后。
索伦·莫特森

3

只需添加

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

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


如果您想将其设置为接受来自任何地方的请求,那就很好了;如果您不这样做,那就不好了,这就是标题的全部内容。
Godwhacker

2

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

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

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


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]

1

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


1
看起来该方案是预期的,请查看w3.org/TR/cors上的示例,但无论如何,还是谢谢,我也做错了事,是的,缺少Firefox错误消息。
理查德·格林

1

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

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


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,在我拥有的Directory Block上

  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


0

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

禁用它或者卸载插件必须解决这个问题。

就您而言,它可能不是adblocker,而是另一个Firefox插件。首先以隐身方式对其进行测试(不使用插件),以确定是否是问题所在,然后系统地禁用插件,直到找到罪魁祸首。


-3

这些文件不言自明。制作文件,随便什么。就我而言,是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的配额将很快消耗掉。

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


请不要重复发布相同的答案。并且请确保您的答案确实回答了问题。如果您需要指导其他人以获取更多信息,这不是一个好答案。
elixenide 2015年

您好我使用了链接,因为它具有一些更多的信息,如先决条件等。如果您觉得合适,我将其删除。
严厉的梅塔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.