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 ?

9voto

Santanu Brahma Points 121

Il semble que vous utilisez une ancienne version de slim (2.x). Vous pouvez simplement ajouter les lignes suivantes au fichier .htaccess et vous n'avez pas besoin de faire quoi que ce soit en PHP scripts.

# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(domain_one\.com|domain_two\.net)$" 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"
Header always set Access-Control-Allow-Headers: Authorization

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

5voto

abimelex Points 1180

Grâce à Devin, j'ai trouvé la solution pour mon application SLIM avec un accès multi-domaine.

Dans htaccess :

SetEnvIf Origin "http(s)?://(www\.)?(allowed.domain.one|allowed.domain.two)$" AccessControlAllowOrigin=$0$1
Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials true

dans index.php

// 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']}");
}
// instead of mapping:
$app->options('/(:x+)', function() use ($app) {
    //...return correct headers...
    $app->response->setStatus(200);
});

1voto

J'ai essayé la solution de @abimelex, mais dans Slim 3.0, le mappage des requêtes OPTIONS se fait comme suit :

$app = new \Slim\App();
$app->options('/books/{id}', function ($request, $response, $args) {
    // Return response headers
});

https://www.slimframework.com/docs/objects/router.html#options-route

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