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会说些什么。 艾艾。
试试这应该是解决你的问题
- 在你的config.php中添加www pre在你的domain.com实例。 // HTTP定义('HTTP_SERVER',' http://域名与www /');
// HTTPS define('HTTPS_SERVER',' http://域名与www /');
- 添加你的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的配额将被消耗得相当快。
当然,我们可以做的事情是没有尽头的,比如把数据放到一个表格中,发送到数据库等等。