Firefox 'demande D'origine croisée bloquée' malgré les en-têtes
j'essaie de faire une simple requête cross-origin, et Firefox le bloque systématiquement avec cette erreur:
demande D'origine croisée bloquée: la même Politique d'origine interdit la lecture de la ressource distante à [url]. Ceci peut être corrigé en déplaçant la ressource vers le même domaine ou en activant CORS. [url]
il fonctionne très bien dans le Chrome et le Safari.
autant que je sache, j'ai mis tous les corriger les en-têtes sur mon PHP pour permettre à cela de fonctionner. Voici la réponse de mon serveur avec
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
j'ai essayé D'utiliser angulaire, JQuery et un XMLHTTPRequest
objet de base, comme ainsi:
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()
...et ça marche dans tous les navigateurs sauf Firefox. Quelqu'un peut-il aider?
9 réponses
S'avère que cela n'a rien à voir avec CORS - c'était un problème avec le certificat de sécurité. Erreurs = 4 heures de maux de tête.
j'ai trouvé que mon problème était que le serveur à qui j'ai envoyé la requête croisée avait un certificat qui n'était pas fiable.
Si vous souhaitez vous connecter à une croix de domaine avec https
, vous devez ajouter une exception pour ce certificat.
vous pouvez le faire en visitant le lien bloqué une fois et en ajoutant l'exception.
j'ai trouvé la solution après 2 jours :(.
Note importante: lors de la réponse à une demande validée, le serveur doit spécifiez un domaine, et ne peut pas utiliser de caractères sauvages.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
Juste un mot d'avertissement. J'ai finalement contourné le problème avec Firefox et CORS.
la solution pour moi était ce poste
cependant Firefox se comportait vraiment, vraiment étrange après avoir mis ces en-têtes sur le serveur Apache (dans le dossier .htaccess).
j'ai ajouté beaucoup de console.log("Hi FF, you are here A")
etc pour voir ce qui se passait.
au début, on aurait dit qu'il avait été pendu sur xhr.send()
. Mais j'ai découvert qu'il n'était pas arrivé à cette déclaration. J'ai placé un autre console.log
juste avant et n'y suis pas arrivé - même s'il n'y avait rien entre le dernier console.log
et le nouveau. Il s'est arrêté entre deux console.log
.
modifier l'Ordre des lignes, Supprimer, pour voir s'il y avait personnage étrange dans le dossier. Je n'ai rien trouvé.
redémarrer Firefox a réglé le problème.
Oui, je dois remplir un rapport de bogue. C'est juste que c'est tellement étrange, alors ne sais pas comment le reproduire.
NOTICE : et, oh, je viens de faire les parties Header always set
, pas la partie Rewrite*
!
il suffit d'ajouter
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
à la .htaccess
fichier dans la racine du site web que vous essayez de vous connecter avec.
essayez ceci, cela devrait résoudre votre problème
-
dans votre configuration.php, ajouter www pre dans votre domain.com. Par exemple:
HTTP define('HTTP_SERVER', 'http://domain name with www/'); HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
-
ajoutez ceci à votre .fichier htaccess
RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ [R=200,L]
pour moi, il s'avère que je mettais Access-Control-Allow-Origin
à un spécifique (et le correct) host.com
mais il devait être http://host.com
à la place. Qu'est-ce que firefox? Il avale silencieusement la requête GET et renvoie un statut 0 à la XHR, sans aucune sortie de warnings à la console javascript, alors que pour d'autres échecs similaires, il dirait au moins quelque chose. Ai ai.
Les fichiers sont explicites. Faites un dossier, appelez ça n'importe quoi. Dans mon cas, 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>
maintenant nous allons inclure un moteur, faire un fichier, appelez-le comme vous voulez. Dans mon cas, c'est 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);
j'ai essayé de garder l'exemple aussi simple que possible. Et parce qu'il exécute le lien sur chaque keypress, le quota de votre API sera consommé assez rapidement.
bien sûr, il n'y a pas de fin des choses que nous pouvons faire, comme mettre les données dans une table, Envoyer à la base de données et ainsi de suite.
il semble que ce soit un bug sur Firefox 44 qui a été corrigé sur la version 45.