Le jeu d'en-têtes Access-Control-Allow-Origin dans .htaccess ne fonctionne pas


90

Je n'arrive pas à comprendre pourquoi mes .htaccessparamètres d'en-tête ne fonctionnent pas.

.htaccessContenu de mon 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 les supprime Headeret les ajoute, index.phptout 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 je rate?

Réponses:


134

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"

46
N'oubliez pas d'activer les ena2enmod headers
Lucas Serafim

1
Il a corrigé: "La méthode PUT n'est pas autorisée par Access-Control-Allow-Methods"
Rahul Prasad

6
En outre, il est préférable d'utiliser Header setdans ce cas. Si le code est modifié et qu'il définit l'en-tête, le fait qu'Apache fasse un header addenvoie des en-têtes doubles **. Cela cassera des clients comme Restangular par exemple.
Julian

2
N'oubliez pas, si nécessaire,Header add Access-Control-Allow-Credentials "true"
Marco Marsala

20

Pour mémoire, je rencontrais exactement le même problème et aucune des réponses n'a fonctionné.

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 revenu était 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 s'est produite et la requête AJAX n'honore / ne suit pas les redirections.

Il s'est avéré être la barre oblique manquante à la fin du domaine ( http://192.0.2.1/upload / )

J'ai testé à nouveau avec slash à la fin et j'ai obtenu ceci ci-dessous. Ajout d'une barre oblique dans le script aussi, et cela 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 tester si vos en-têtes sont bons et pour dépanner ce qui se passe.


5
J'ai 11 onglets ouverts en ce moment pour essayer de résoudre ce problème. Cette réponse devrait être dans plus d'endroits.
JDavis

Avec le mien, je devais supprimer la barre oblique finale. Tellement content d'avoir trouvé ça. J'ai passé tellement de temps à résoudre ce problème quand je suis nouveau, cela aurait dû fonctionner il y a des heures.
gorelog

11

J'ai un hébergement partagé sur GoDaddy. J'avais aussi besoin d'une réponse à cette question, et après avoir cherché autour de moi, j'ai trouvé que c'était possible.

J'ai écrit un fichier .htaccess, je l'ai mis 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
    });

Consultez cet article pour référence:

Le jeu d'en-têtes Access-Control-Allow-Origin dans .htaccess ne fonctionne pas


8

Soyez prudent sur:

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

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

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"

Cordialement,


3
Cela ne fonctionnera pas. Access-Control-Allow-Origin n'est pas autorisé à plusieurs valeurs. Vous devez définir dynamiquement l'en-tête en fonction de la valeur de l'en-tête de la demande Origin.
Quentin

7

J'ai activé les en-têtes de module Apache en-têtes a2enmod, et le problème a été résolu.


Les erreurs dans le journal n'étaient pas claires quant à la raison pour laquelle les changements que je faisais échoueraient et cette réponse a beaucoup aidé. sudo a2enmod headerset un redémarrage l'a fait fonctionner!
cchana

3

Essayez ceci dans le .htaccess du dossier racine externe

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

Attention sur: Header add Access-Control-Allow-Origin "*" Ce n'est pas du tout judicieux d'accorder l'accès à tout le monde. Je pense que vous devriez utiliser:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

J'ai attribué +1 à la réponse de Miro pour le lien vers le site de vérification des en-têtes http://www.webconfs.com/http-header-check.php . Il affiche une annonce désagréable chaque fois que vous l'utilisez, mais il est néanmoins très utile pour vérifier la présence de l'en-tête Access-Control-Allow-Origin.

Je lis un fichier .json à partir du javascript sur ma page Web. J'ai trouvé que l'ajout de ce qui suit à mon fichier .htaccess a résolu le problème lors de l'affichage de ma page Web dans IE 11 (version 11.447.14393.0):

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

J'ai également ajouté ce qui suit à /etc/httpd.conf (fichier de configuration d'Apache):

AllowOverride All

Le site de vérification d'en-tête a vérifié que l'en-tête Access-Control-Allow-Origin est maintenant envoyé (merci, Miro!).

Cependant, Firefox 50.0.2, Opera 41.0.2353.69 et Edge 38.14393.0.0 récupèrent tous le fichier de toute façon, même sans l'en-tête Access-Control-Allow-Origin. (Remarque: ils peuvent vérifier les adresses IP, car les deux domaines que j'utilisais sont tous deux hébergés sur le même serveur, à la même adresse IPv4.)

Cependant, Chrome 54.0.2840.99 m (64 bits) ignore l'en-tête Access-Control-Allow-Origin et échoue de toute façon, signalant par erreur:

Aucun en-tête «Access-Control-Allow-Origin» n'est présent sur la ressource demandée. L' accès à l' origine " {mydomain} " n'est donc pas autorisé.

Je pense que cela doit être une sorte de «premier». IE fonctionne correctement; Chrome, Firefox, Opera et Edge sont tous bogués; et Chrome est le pire . N'est-ce pas exactement le contraire du cas habituel?


0

Après avoir passé une demi-journée sans que rien ne fonctionne. En utilisant un service de vérification d'en-tête si tout fonctionnait. Le pare-feu au travail les dépouillait


0

essaye ça:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

Il est préférable d'autoriser une liste d'hôte de confiance connu.


0

Si quelqu'un d'autre essaie cela, la réponse la plus votée devrait fonctionner. Cependant, si vous rencontrez des problèmes, il est possible que le navigateur ait mis en cache la DEMANDE. Pour confirmer, ajoutez une chaîne de requête.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.