J'ai créé un service RESTful de base avec le framework SLIM PHP) et j'essaie maintenant de le connecter pour pouvoir accéder au service à partir d'un projet Angular.js. J'ai lu que = Angular supporte CORS hors de la boîte et tout ce que j'avais à faire était d'ajouter cette ligne: Header set Access-Control-Allow-Origin "*"
à mon fichier .htaccess.
J'ai fait ceci et mon REST fonctionne toujours (aucune erreur de serveur interne 500 d'un mauvais .htaccess)), mais j'essaie de le tester depuis test-cors.org il jette une erreur.
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"
Dois-je ajouter quelque chose à mon fichier .htaccess pour que cela fonctionne correctement ou existe-t-il un autre moyen d'activer CORS sur mon serveur?
De toute façon, puisque tout était transféré vers index.php, je pensais essayer de définir les en-têtes dans PHP au lieu du fichier .htaccess et cela a fonctionné! YAY! Voici ce que j'ai ajouté à index.php pour quiconque 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 mérite revient à slashingweapon pour sa réponse sur cette question
Comme j'utilise Slim, j'ai ajouté cette route pour que les requêtes OPTIONS obtiennent une réponse HTTP 200
// return HTTP 200 for HTTP OPTIONS requests
$app->map('/:x+', function($x) {
http_response_code(200);
})->via('OPTIONS');
Est-ce que le .htaccess
_ utilise add
au lieu de set
?
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
C'est ce qui a fonctionné 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"
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>
On dirait que vous utilisez une ancienne version de slim (2.x). Vous pouvez simplement ajouter les lignes suivantes à .htaccess et n'avez rien à faire dans les scripts PHP.
# 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]
Sera travail 100%, Postulez en .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]
Grâce à Devin, j'ai trouvé la solution pour mon application SLIM avec accès multi-domaines.
En 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);
});
J'ai essayé la solution @abimelex, mais dans Slim 3.0, le mappage des requêtes OPTIONS se présente 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