Access-Control-Origin в рамках Slim Framework и Ember.js

Прочитав много вопросов / ответов, я решил опубликовать. Я думаю Slim Framework — запрос jQuery $ .ajax — метод DELETE не разрешен Access-Control-Allow-Methods подводит итог большей части информации, которую я нашел и опробовал.

Я использую MAMP с PHP 5.6 для разработки, но производственная среда, скорее всего, будет общим хостом. Я также использую ember.js

Когда ember выполняет запрос POST, я получаю сообщение Access-Cross-Origin:

XMLHttpRequest не может загрузить http://foo.bar/. В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». ПроисхождениеHTTP: // локальный: 4200Поэтому не допускается доступ.

Я понимаю, что настройки соответствующих заголовков на сервере могут решить проблему, но я не знаю, когда это сделать. То, что я сейчас делаю в рамках Slim, это:

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

$app->options('/(:name+)', function() use($app) {
$response = $app->response();
$app->response()->status(200);
$response->header('Access-Control-Allow-Origin', '*');
$response->header('Access-Control-Allow-Headers', 'Content-Type, X-Requested-With, X-authentication, X-client');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
});

Тем не менее, я проверил запросы Ember.js, и он не запрашивает OPTIONS и, следовательно, правильные заголовки не установлены.

Если я устанавливаю заголовки в отдельном маршруте Slim, то он работает правильно. Но я не хочу устанавливать заголовки на каждом маршруте, один за другим.

Что я могу сделать, чтобы установить заголовки для всех маршрутов?

3

Решение

CorsSlim твой друг:

<?php
$app = new \Slim\Slim();
$corsOptions = array(
"origin" => "*",
"exposeHeaders" => array("Content-Type", "X-Requested-With", "X-authentication", "X-client"),
"allowMethods" => array('GET', 'POST', 'PUT', 'DELETE', 'OPTIONS')
);
$cors = new \CorsSlim\CorsSlim($corsOptions);

$app->add($cors);
3

Другие решения

Вместо добавления нового пакета в ваш проект вы можете просто сделать это

$app->add(function ($req, $res, $next) {
$response = $next($req, $res);
return $response
->withHeader('Access-Control-Allow-Origin', 'http://mysite')
->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
});

https://www.slimframework.com/docs/v3/cookbook/enable-cors.html

3

По вопросам рекламы [email protected]