2012-01-03 21 views
75

Mam prosty skrypt PHP, który Ja próbuje się między domenami CORS żądanie:CORS z nagłówkami php

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

Mimo to nadal pojawia się błąd:

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

nic mi brakuje ?

Odpowiedz

37

Access-Control-Allow-Headers nie zezwala na przyjmowanie wartości *, zobacz dokumentację Mozilli here.

Zamiast gwiazdki należy wysłać zaakceptowane nagłówki (najpierw X-Requested-With, jak informuje błąd).

191

Właściwe rozpatrywanie wniosków CORS jest nieco bardziej zaangażowane. Oto funkcja, która zareaguje pełniej (i odpowiednio).

/** 
* 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

Pamiętaj, że wysyłając wartość Origin HTTP z powrotem jako dozwolonym pochodzenia pozwolą nikomu wysyłać żądania do was z ciasteczek, co potencjalnie kradzież sesję od użytkownika, który zarejestrował się w witrynie następnie oglądany stronę atakującego. Chcesz wysłać "*" (co uniemożliwi korzystanie z plików cookie, zapobiegając kradzieży sesji) lub określone domeny, dla których witryna ma działać. – Jules

+1

Uzgodnione. W praktyce prawdopodobnie nie pozwolisz, aby jakakolwiek stara domena korzystała z Twojej usługi CORS, ograniczyłbyś ją do zestawu, któremu postanowiłeś zaufać. – slashingweapon

+0

Dzięki za szczegółowe wyjaśnienie. @slashingweapon – Bimal

22

Mam ten sam błąd i naprawić go z poniższej PHP w moim back-end skryptu:

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

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

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

6

Ja po prostu udało się dostać DropZone i inne wtyczki do pracy z tej poprawki (angularjs + php backend)

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'); 

dodać to w upload.php lub gdzie chcesz wysłać swoją prośbę (na przykład, jeśli masz upload.html i trzeba dołączać pliki do upload.php, skopiuj i wklej te 4 l ines). Jeśli używasz wtyczek/dodatków CORS w chrome/mozilla, pamiętaj, aby przełączać je więcej niż jeden raz, aby włączyć obsługę CORS

2

Jeśli chcesz utworzyć usługę CORS z PHP, możesz użyć Kod ten jako pierwszy krok w pliku, który obsługuje żądania:

// 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 może stać się ból głowy, jeśli nie poprawnie zrozumieć jego funkcjonowanie. Używam ich w PHP i działają bez problemów. 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

Wiele opis całego internetu nie wspomnieć, że określenie Access-Control-Allow-Origin nie wystarczy. Powyżej znajduje się pełna przykładów, które działa dla mnie:

<?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

Ten kod działa znacznie w dół dla mnie podczas korzystania kątowe 4 po stronie klienta, jak i PHP jako stronie serwera.

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

Powiązane problemy