Я создал базовую услугу 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>