Firefox CORS请求给予“跨源请求被阻止”,尽pipe标题

我试图做一个简单的跨源请求,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的。 任何人都可以帮忙吗?

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

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

如果您想通过https(firefox)连接到跨域,则必须首先为该证书添加该证书。

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

希望这可以帮助别人!

我已经find了2天后的解决scheme:(。

重要注意事项:当响应有证书请求时,服务器必须指定一个域,并且不能使用通配。

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

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

我的解决scheme是这个职位

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

但是,在Apache服务器(在.htaccess文件夹中)设置这些头文件后,Firefox的行为真的很奇怪。

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

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

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

重新启动Firefox修复了这个问题。

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

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

只需添加

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

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

对我来说,事实certificate,我设置Access-Control-Allow-Origin到一个特定的(和正确的) host.com但它必须是http://host.com 。 firefox是做什么的? 它静静吞下GET请求,并返回一个状态0到XHR,没有警告输出到JavaScript控制台,而对于其他类似的失败,至less会说些什么。 艾艾。

试试这应该是解决你的问题

  1. 在你的config.php中添加www pre在你的domain.com实例。 // HTTP定义('HTTP_SERVER',' http://域名与www /');

// HTTPS define('HTTPS_SERVER',' http://域名与www /');

  1. 添加你的htaccess文件

RewriteCond%{REQUEST_METHOD}选项RewriteRule ^(。*)$ $ 1 [R = 200,L]

这似乎是在版本45固定的Firefox 44上的一个错误。

这些文件是自解释的。 制作一个文件,把它叫做什么。 在我的情况下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的配额将被消耗得相当快。

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