Ответ 1
Access-Control-Allow-Headers
не допускает *
качестве допустимого значения, см. Документацию Mozilla здесь.
Вместо звездочки вы должны отправить принятые заголовки (сначала X-Requested-With
как говорится в сообщении об ошибке).
У меня есть простой PHP script, который я пытаюсь выполнить запрос CORS между доменами:
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...
Но я все еще получаю ошибку:
Поле заголовка запроса
X-Requested-With
не разрешеноAccess-Control-Allow-Headers
Что-нибудь мне не хватает?
Access-Control-Allow-Headers
не допускает *
качестве допустимого значения, см. Документацию Mozilla здесь.
Вместо звездочки вы должны отправить принятые заголовки (сначала X-Requested-With
как говорится в сообщении об ошибке).
Обработка запросов 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!";
}
Я получил ту же ошибку и исправил ее с помощью следующего PHP в моем внутреннем скрипте:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Requested-With");
Многие описания в Интернете не упоминают, что указать 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);
Мне просто удалось получить dropzone и другой плагин для работы с этим исправлением (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');
добавьте это в свой файл upload.php или куда вы отправите свой запрос (например, если у вас есть upload.html, и вам нужно прикрепить файлы к upload.php, скопируйте и вставьте эти 4 строки). Также, если вы используете плагины/аддоны CORS в chrome/mozilla, обязательно включите их более одного раза, чтобы включить CORS.
Если вы хотите создать службу 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
CORS может стать головной болью, если мы не правильно понимаем его функционирование. Я использую их в PHP, и они работают без проблем. ссылка здесь
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");
Этот код работает для меня при использовании angular 4 в качестве клиентской и PHP в качестве серверной.
( "Access-Control-Allow-Origin: *" );
это должно работать
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
Этот пример кода в приведенном выше коде, по-видимому, является ошибкой. В этом коде заголовки ответа содержатся в {фигурных скобках}. Как только я удалил их, Аксиос, наконец, перестал бросать ошибки.
добавить этот код в .htaccess
добавить пользовательский ключ аутентификации в заголовок, такой как 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"
Хорошо. Айнен Дедигин Гиби Олду. Bende Oyle Yaptim