Cross-Origin Request Headers (CORS) with PHP headers
Mam prosty skrypt PHP, który próbuję wykonać żądanie CORS między domenami:
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...
Jednak nadal dostaję błąd:
Coś mi umknęło?Pole nagłówka żądania
X-Requested-With
nie jest dozwolone przezAccess-Control-Allow-Headers
11 answers
Access-Control-Allow-Headers
nie pozwala *
jako akceptowanej wartości, zobacz dokumentację Mozilli tutaj .
Zamiast gwiazdki należy wysłać zaakceptowane nagłówki (najpierw X-Requested-With
Jak mówi błąd).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 10:34:22
Prawidłowa obsługa żądań Kors jest nieco bardziej zaangażowana. Oto funkcja, która odpowie pełniej (i prawidłowo).
/**
* 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
* - https://fetch.spec.whatwg.org/#http-cors-protocol
*
*/
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!";
}
Notatki Bezpieczeństwa
Gdy przeglądarka chce wykonać żądanie między witrynami, najpierw potwierdza, że jest to w porządku z żądaniem "pre-flight" do adresu URL. Zezwalając CORS mówisz przeglądarce, że odpowiedzi z tego adresu URL mogą być współdzielone z innymi domenami.
CORS nie chroni Twojego serwera. CORS stara się chronić użytkowników poprzez informowanie przeglądarek, jakie powinny być ograniczenia dotyczące udostępniania odpowiedzi innym domenom. Zwykle tego rodzaju udostępnianie jest całkowicie zabronione, więc CORS jest sposobem na przebicie dziury w normalnej polityce bezpieczeństwa przeglądarki. Otwory te powinny być jak najmniejsze, więc zawsze sprawdzaj http_origin na jakiejś wewnętrznej liście.
Istnieją pewne zagrożenia , zwłaszcza jeśli dane serwowane przez adres URL są normalnie chronione. Skutecznie zezwalasz na zawartość przeglądarki, która powstały na innym serwerze, aby odczytać (i ewentualnie manipulować) dane na twoim serwerze.
Jeśli zamierzasz używać CORS, przeczytaj uważnie protokół (jest dość mały) i spróbuj zrozumieć, co robisz. W tym celu w próbce kodu podany jest adres URL odniesienia.
Header security
Zaobserwowano, że nagłówek HTTP_ORIGIN jest niepewny i to prawda. W rzeczywistości wszystkie nagłówki HTTP nie są bezpieczne dla różnych znaczeń tego terminu. Chyba że nagłówek zawiera weryfikowalny podpis/hmac, lub cała rozmowa jest uwierzytelniona przez TLS, nagłówki są po prostu "coś, co powiedziała mi przeglądarka".
W tym przypadku przeglądarka mówi: "obiekt z domeny x chce uzyskać odpowiedź z tego adresu URL. W porządku?"Chodzi o to, aby CORS był w stanie odpowiedzieć: "tak, pozwolę na to".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-06 22:49:16
Dostałem ten sam błąd i naprawiłem go za pomocą następującego PHP w moim skrypcie zaplecza:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Requested-With");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 20:43:21
Wiele opisów w Internecie nie wspomina, że określenie Access-Control-Allow-Origin
nie wystarczy. Oto kompletny przykład, który 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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-26 14:23:50
Po prostu udało mi się uruchomić dropzone i inne wtyczki do pracy z tą poprawką (angularjs + backend 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');
Dodaj to do swojego uploadu.php lub gdzie można wysłać żądanie (na przykład, jeśli masz upload.html i musisz załączyć pliki do przesłania.php, następnie skopiuj i wklej te 4 linie). Jeśli używasz wtyczek/dodatków CORS w chrome / Mozilli, upewnij się, że przełączasz je więcej niż jeden raz, aby CORS był włączony
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 15:52:57
Jeśli chcesz utworzyć usługę CORS z PHP, możesz użyć tego kodu jako pierwszego kroku 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 14:15:01
Kors może stać się bólem głowy, jeśli nie dobrze rozumiemy 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");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 19:24:38
Ten kod działa na mnie, gdy używam angular 4 jako strony klienta i PHP jako strony serwera.
header("Access-Control-Allow-Origin: *");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-16 13:32:09
To powinno zadziałać
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 00:31:35
Dodaj ten kod w .htaccess
Dodaj niestandardowy klucz uwierzytelniania w nagłówku, takim jak app_key, auth_key..etc
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-11 16:33:50
W Windows, wklej to polecenie w Uruchom okno tylko na czas, aby przetestować kod
Chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-16 11:57:59