J'essaie de publier des données de formulaire de www.siteone.com à www.sitetwo.com via CORS. Mon code ajax est le suivant:
<script>
$(document).ready(function(){
$("#submit").live('click',function() {
var url = "http://www.sitetwo.com/cors.php";
var data = $('#form').serialize();
jQuery.ajax({
url : url,
type: "POST",
data : $('#form').serialize(),
}).done(function(response){
alert(response);
}).fail(function(error){
console.log(error.statusText);
});
return false;
});
});
</script>
et le fichier cors.php dans www.sitetwo.com
est comme suit:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
echo "hai";
?>
Mais l'erreur Access-control-Allow-Origin est toujours renvoyée. L'erreur lancée est la suivante:
XMLHttpRequest cannot load http://www.sitetwo.com/cors.php. Origin http://www.siteone.com is not allowed by Access-Control-Allow-Origin.
J'ai appris que, en utilisant CORS en autorisant simplement le site Web distant via des en-têtes, nous pouvons utiliser la demande interdomaine. Mais quand j'ai essayé comme ça, une erreur est levée. Ai-je oublié quelque chose ici? Voici mes en-têtes de demande/réponse:
Response Headers
Connection Keep-Alive
Content-Length 487
Content-Type text/html; charset=iso-8859-1
Date Fri, 23 Aug 2013 05:53:20 GMT
Keep-Alive timeout=15, max=99
Server Apache/2.2.15 (CentOS)
WWW-Authenticate Basic realm="Site two Server - Restricted Area"
Request Headers
Accept */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length 43
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Host www.sitetwo.com
Origin http://www.siteone.com
Referer http://www.siteone.com/index.html
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
Enfin, j'ai moi-même résolu le problème expliqué dans la question. Le code que j'ai implémenté pour accéder à l'en-tête est incorrect.
Le code à deux lignes mentionné ci-dessous, lorsqu'il est donné, ne fonctionne pas:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
?>
Mais la gestion correcte des demandes CORS est un peu plus complexe. Voici une fonction qui répondra plus complètement. Le code mis à jour est le suivant:
<?php
// Allow from any Origin
if (isset($_SERVER['HTTP_Origin'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_Origin']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
echo "You have CORS!";
?>
J'ai trouvé d'un autre post Cela a fonctionné ....
Une autre raison est que si vous manquez un point-virgule ou quelque chose dans votre php, ce message d'erreur CORS sera la seule erreur affichée par l'ajax, même si le rapport d'erreurs est activé, tandis que vous pouvez voir l'erreur réelle en allant à l'url php dans votre navigateur.