2012-01-03 1 views
75

У меня есть простой PHP скрипт, который я пытаюсь междоменное CORS запрос:CORS с PHP заголовков

<?php 
header("Access-Control-Allow-Origin: *"); 
header("Access-Control-Allow-Headers: *"); 
... 

Но я все еще получаю ошибку:

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers

Все, что мне не хватает ?

ответ

37

Access-Control-Allow-Headers не разрешает * как принятое значение, см. Документацию Mozilla here.

Вместо звездочки вы должны отправить принятые заголовки (сначала X-Requested-With, как говорится в ошибке).

191

Обращение с запросами CORS должным образом является более привлекательным. Вот функция, которая будет реагировать более полно (и правильно).

/** 
* An example CORS-compliant method. It will allow any GET, POST, or OPTIONS requests from any 
* origin. 
* 
* In a production environment, you probably want to be more restrictive, but this gives you 
* the general idea of what is involved. For the nitty-gritty low-down, read: 
* 
* - https://developer.mozilla.org/en/HTTP_access_control 
* - http://www.w3.org/TR/cors/ 
* 
*/ 
function cors() { 

    // Allow from any origin 
    if (isset($_SERVER['HTTP_ORIGIN'])) { 
     // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one 
     // you want to allow, and if so: 
     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'])) 
      // may also be using PUT, PATCH, HEAD etc 
      header("Access-Control-Allow-Methods: GET, POST, OPTIONS");   

     if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
      header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 

     exit(0); 
    } 

    echo "You have CORS!"; 
} 
+23

Обратите внимание, что отправка значение HTTP Origin обратно в разрешенном происхождения позволит никому отправлять запросы к вам с печеньем, таким образом, потенциально кражу сеанса от пользователя, вошедшего в свой сайт, то просмотрел страницу злоумышленника. Вы либо хотите отправить «*» (который запретит файлы cookie, тем самым предотвращая кражу сеанса), или определенные домены, для которых вы хотите, чтобы сайт работал. – Jules

+1

Согласовано. На практике вы, вероятно, не допустили бы, чтобы какой-либо старый домен использовал вашу службу CORS, вы бы ограничили ее набором, который вы решили доверять. – slashingweapon

+0

Спасибо за подробное объяснение. @slashingweapon – Bimal

22

Я получил ту же ошибку, и фиксируется с помощью следующей PHP в моем фоновом скрипте:

header('Access-Control-Allow-Origin: *');

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");

6

Я просто удался получить Dropzone и другой плагин, чтобы работать с этим исправлением (angularjs + PHP бэкенд)

header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Credentials: true"); 
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); 
    header('Access-Control-Max-Age: 1000'); 
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization'); 

добавить это в upload.php или где бы вы отправить запрос (например, если у вас есть upload.html и вы должны прикрепить файлы к upload.php, а затем скопировать и вставьте эти 4 л Инес). Также, если вы используете плагины/дополнения CORS в chrome/mozilla, обязательно переключите их более одного раза, чтобы включить CORS.

2

Если вы хотите создать службу CORS с PHP, вы можете использовать этот код в качестве первого шага в файле, который обрабатывает запросы:

// Allow from any origin 
if(isset($_SERVER["HTTP_ORIGIN"])) 
{ 
    // You can decide if the origin in $_SERVER['HTTP_ORIGIN'] is something you want to allow, or as we do here, just allow all 
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
} 
else 
{ 
    //No HTTP_ORIGIN set, so we allow any. You can disallow if needed here 
    header("Access-Control-Allow-Origin: *"); 
} 

header("Access-Control-Allow-Credentials: true"); 
header("Access-Control-Max-Age: 600"); // cache for 10 minutes 

if($_SERVER["REQUEST_METHOD"] == "OPTIONS") 
{ 
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"])) 
     header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support 

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"])) 
     header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 

    //Just exit with 200 OK with the above headers for OPTIONS method 
    exit(0); 
} 
//From here, handle the request as it is ok 
3

CORS может стать головной болью, если мы не будем правильно понимать его функционирование. Я использую их в PHP, и они работают без проблем. reference here

header("Access-Control-Allow-Origin: *"); 
header("Access-Control-Allow-Credentials: true"); 
header("Access-Control-Max-Age: 1000"); 
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding"); 
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE"); 
5

Многие описание интернет-широкий, не говоря уже о том, что указания Access-Control-Allow-Origin недостаточно. Вот полный пример, который работает для меня:

<?php 
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { 
     header('Access-Control-Allow-Origin: *'); 
     header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS'); 
     header('Access-Control-Allow-Headers: token, Content-Type'); 
     header('Access-Control-Max-Age: 1728000'); 
     header('Content-Length: 0'); 
     header('Content-Type: text/plain'); 
     die(); 
    } 

    header('Access-Control-Allow-Origin: *'); 
    header('Content-Type: application/json'); 

    $ret = [ 
     'result' => 'OK', 
    ]; 
    print json_encode($ret); 
0

Это много коды работает вниз для меня при использовании угловых 4, как на стороне клиента и PHP как на стороне сервера.

header("Access-Control-Allow-Origin: *");