93 votes

L'en-tête Access-Control-Allow-Origin dans .htaccess ne fonctionne pas

Je n'arrive pas à comprendre pourquoi mon .htaccess Les paramètres de l'en-tête ne fonctionnent pas.

Mi .htaccess le contenu du fichier :

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

Mais quand je retire Header et les ajouter dans index.php alors tout fonctionne bien.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

Qu'est-ce que j'ai manqué ?

137voto

imbrizi Points 1260

Cela devrait fonctionner :

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

22voto

miro Points 1096

Pour mémoire, je rencontrais exactement le même problème et aucune des réponses ne fonctionnait.

J'ai utilisé un outil de vérification des en-têtes : http://www.webconfs.com/http-header-check.php

Je testais avec mon IP ( http://192.0.2.1/upload ) et ce qui est ressorti est le suivant :

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

Une redirection a eu lieu et la requête AJAX ne respecte pas les redirections.

Il s'est avéré que c'était la barre oblique manquante à la fin du domaine. ( http://192.0.2.1/upload / )

J'ai testé à nouveau avec la barre oblique à la fin et j'ai obtenu ce qui suit. J'ai ajouté un slash dans le script aussi, et ça fonctionnait maintenant.

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

Utilisez cet outil pour vérifier si vos en-têtes sont bons et pour dépanner ce qui se passe.

11voto

Gregory Lewis Points 440

J'ai un hébergement partagé sur GoDaddy. J'avais aussi besoin d'une réponse à cette question, et après avoir fait des recherches, j'ai découvert que c'était possible.

J'ai écrit un fichier .htaccess et je l'ai placé dans le même dossier que ma page d'action. Voici le contenu du fichier .htaccess :

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

Voici mon appel ajax :

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

Voir cet article pour référence :

L'en-tête Access-Control-Allow-Origin dans .htaccess ne fonctionne pas

9voto

Alex Points 215

Soyez prudent :

 Header add Access-Control-Allow-Origin "*"

Il n'est pas du tout judicieux d'accorder l'accès à tout le monde. Il est préférable de n'autoriser qu'une liste d'hôtes de confiance connus...

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

Regards,

7voto

Edyd Junges Points 81

J'ai testé avec le code de Gregory Lewis et ça a marché comme sur des roulettes.

Créez un fichier .htaccess sur le domaine auquel vous voulez accéder.

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X