включить 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 на моем сервере?

Author: Devin Crossman, 2013-01-23

7 answers

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

// 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']}");

}

Заслуга slashingweapon в его ответе на этот вопрос

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

// return HTTP 200 for HTTP OPTIONS requests
$app->map('/:x+', function($x) {
    http_response_code(200);
})->via('OPTIONS');
 69
Author: Devin Crossman, 2018-06-15 23:58:57

Не следует ли .htaccess использовать add вместо set?

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
 59
Author: markmarijnissen, 2013-12-30 11:20:41

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

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"
 10
Author: Jack Leon, 2016-06-22 13:06:25

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

<Files "index.php">
  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
</Files>
 7
Author: jcubic, 2017-05-23 11:47:36

Похоже, что вы используете старую версию 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]
 4
Author: Santanu Brahma, 2016-02-29 18:35:10

Благодаря Девину я нашел решение для своего ТОНКОГО приложения с доступом к нескольким доменам.

В 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);
});
 2
Author: Karl Adler, 2014-10-27 14:26:36

Я попробовал решение @abimelex, но в Slim 3.0 сопоставление запросов ПАРАМЕТРОВ выглядит следующим образом:

$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

 1
Author: Rocío García Luque, 2017-01-12 20:42:03