включить cors в .htaccess

Я создал базовую услугу RESTful с платформой SLIM PHP, и теперь я пытаюсь подключить ее, чтобы получить доступ к сервису из проекта Angular.js. Я прочитал, что Angular поддерживает CORS из коробки, и все, что мне нужно было сделать, это добавить эту строку: Header set Access-Control-Allow-Origin "*" в мой .htaccess файл.

Я сделал это, и мое приложение REST все еще работает (нет 500 ошибок внутреннего сервера из-за плохого .htaccess), но когда я пытаюсь проверить его с test-cors.org, он выдает ошибку.

 Fired XHR event: loadstart Fired XHR event: readystatechange Fired XHR event: error XHR status: 0 XHR status text: Fired XHR event: loadend 

Мой файл .htaccess выглядит так:

 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" 

Есть ли что-то еще, что мне нужно добавить в мой .htaccess, чтобы заставить это работать правильно или есть другой способ включить CORS на моем сервере?

Поскольку в любом случае все было отправлено index.php, я думал, что попробую установить заголовки в PHP вместо файла .htaccess, и это сработало! УРА! Вот что я добавил к index.php для тех, у кого есть эта проблема.

 // Allow from any origin if (isset($_SERVER['HTTP_ORIGIN'])) { 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']}"); } 

кредит идет к slashingweapon за его ответ на этот вопрос

Поскольку я использую Slim, я добавил этот маршрут, чтобы запросы OPTIONS получали ответ HTTP 200

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

Должен ли использовать .htaccess вместо set ?

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

Это то, что сработало для меня:

 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" 

Похоже, вы используете старую версию slim (2.x). Вы можете просто добавить следующие строки в .htaccess и не нужно ничего делать в 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] 

Благодаря Devin, я выяснил решение для моего приложения SLIM с поддержкой нескольких доменов.

В 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 

в 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); }); 

Я попробовал решение @abimelex, но в Slim 3.0 сопоставление запросов OPTIONS выглядит следующим образом:

 $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

Как и в этом ответе Custom HTTP Header для определенного файла, вы можете использовать <File> чтобы включить CORS для одного файла с этим кодом:

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