87 votes

activer les cors dans .htaccess

J'ai créé un service RESTful de base avec le framework SLIM PHP et j'essaie maintenant de le câbler de manière à pouvoir accéder au service depuis un projet Angular.js. J'ai lu qu'Angular supporte CORS d'emblée et tout ce que j'avais à faire était d'ajouter cette ligne : Header set Access-Control-Allow-Origin "*" à mon fichier .htaccess.

J'ai fait cela et mon application REST fonctionne toujours (pas d'erreur 500 internal server due à un mauvais .htaccess) mais quand j'essaie de la tester à partir de test-cors.org une erreur se produit.

Fired XHR event: loadstart
Fired XHR event: readystatechange
Fired XHR event: error

XHR status: 0
XHR status text: 
Fired XHR event: loadend

Mon fichier .htaccess ressemble à ceci

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

Y a-t-il quelque chose d'autre que je dois ajouter à mon .htaccess pour que cela fonctionne correctement ou y a-t-il un autre moyen d'activer CORS sur mon serveur ?

104voto

Devin Crossman Points 2219

Comme tout était redirigé vers index.php de toute façon, j'ai pensé que je pourrais essayer de définir les en-têtes en PHP au lieu du fichier .htaccess et ça a marché ! YAY ! Voici ce que j'ai ajouté à index.php pour toute personne ayant ce problème.

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    // should do a check here to match $_SERVER['HTTP_ORIGIN'] to a
    // whitelist of safe domains
    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, PUT, DELETE, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

}

le crédit revient à slashingweapon pour sa réponse sur cette question

Comme j'utilise Slim, j'ai ajouté cette route pour que les requêtes OPTIONS reçoivent une réponse HTTP 200.

// return HTTP 200 for HTTP OPTIONS requests
$app->map('/:x+', function($x) {
    http_response_code(200);
})->via('OPTIONS');

96voto

markmarijnissen Points 1302

Ne devrait-on pas .htaccess utiliser add au lieu de set ?

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

35voto

Jack Leon Points 361

C'est ce qui a marché pour moi :

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"

15voto

jcubic Points 11141

Comme dans cette réponse En-tête HTTP personnalisé pour un fichier spécifique vous pouvez utiliser <File> pour activer CORS pour un seul fichier avec ce code :

<Files "index.php">
  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
</Files>

Au lieu de "*" vous pouvez mettre une origine spécifique (protocole + domaine + port optionnel).

13voto

levin Points 139

Travailler à 100%, appliquer dans .htaccess :

# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(1xyz\.com|2xyz\.com)$" REQUEST_ORIGIN=$0
Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "x-test-header, Origin, X-Requested-With, Content-Type, Accept"

# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]

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