[英]Setting CURL headers using CURLOPT_HTTPHEADER creates CORS problem
我正在尝试使用 PHP 执行定义 HTTP 标头的 cURL POST 请求,但我遇到了 CORS 问题。
所以我有一个使用 AJAX 从 webapp 调用的 .php 文件。 在 this.php 文件中,我正在使用 cURL 向外部 API 发出 HTTP POST 请求。 一切正常,直到我不得不为身份验证目的设置不同的 HTTP 标头。 当我尝试使用以下命令在 cURL 请求中定义 HTTP 标头时:
//Set Headers
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization': 'someAuthorization',
'x-api-key': 'somekey',
'Content-Type': 'application/x-www-form-urlencoded'
));
我开始在客户端 (webapp) 和我自己的端点之间遇到 CORS 问题,这以前没有发生过。 执行 cURL 请求后,我尝试再次定义标头,但没有成功:
//execute post
$result = curl_exec($ch);
if($result === false){
echo 'Curl error: ' . curl_error($ch);
}else{
//$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//CORS
if (isset($_SERVER['HTTP_ORIGIN'])) {
//header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header("Access-Control-Allow-Origin: http://localhost:4200");
header('Access-Control-Allow-Credentials: true');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
}
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
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 $result;
};
任何想法为什么会这样? 在我看来,通过执行 cURL 请求,我似乎用 cURL 覆盖了标头,因此永远不会应用 CORS 标头配置。
这是.php文件中的所有代码
<?php
$url = 'someurl';
$fields = ['pax' => '2', 'ownerid' => '1', 'channel' => '3'];
//url-ify the data for the POST
$fields_string = http_build_query($fields);
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
//So that curl_exec returns the contents of the cURL; rather than echoing it
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
//Set Headers
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization': 'someAuth',
'x-api-key': 'someKey',
'Content-Type': 'application/x-www-form-urlencoded',
));
//DISABLE SSL
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
//execute post
$result = curl_exec($ch);
if($result === false){
echo 'Curl error: ' . curl_error($ch);
}else{
//$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//CORS
if (isset($_SERVER['HTTP_ORIGIN'])) {
//header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header("Access-Control-Allow-Origin: http://localhost:4200");
header('Access-Control-Allow-Credentials: true');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
}
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
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 $result;
};
curl_close($ch);
?>
在curl请求中设置一些标题不会更改.php脚本中的标题。
更新1:
您的php脚本中有一个解析错误(您自己发现):
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization': 'someAuthorization',
'x-api-key': 'somekey',
'Content-Type': 'application/x-www-form-urlencoded'
));
应该:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: someAuthorization',
'x-api-key: somekey',
'Content-Type: application/x-www-form-urlencoded'
));
对该脚本的Ajax调用会导致错误500响应,该响应具有默认标头, 而不包含您尝试在.php脚本中设置的标头。
在您的本地环境中启用错误报告以查看问题“较早”。
例如在php.ini中:
error_reporting=E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
display_errors=On
@see 如何获取显示的PHP错误?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.