web-dev-qa-db-fra.com

CORS ne fonctionne pas php

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
28
Ganesh Babu

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é ....

80
Ganesh Babu

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.

1
Curtis