php - 如何接收自定义标头并在卷曲中发送它的值?
问题描述
我们正面临一个奇怪的错误,我们不确定为什么会发生这种情况。
有一个 js 客户端正在运行,需要向 PHP 服务器发出请求。该服务器需要从远程位置获取数据,然后将其返回给 js 客户端。每台服务器都在不同的域中,我们已经配置了跨域标头。
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Expose-Headers "X-Session-Token, x-session-token"
Header set Access-Control-Allow-Headers "X-Session-Token, x-session-token, Content-Type, content-type"
我们必须x-session-token
从 JS 接收自定义标头,并将其作为标头转发到远程位置。请参阅下面的代码。a
出于说明目的,我们添加b
了自定义标题。
function generateCheckoutURL() {
$protocol = (isset($_SERVER['HTTPS']) ? 'https' : 'http');
$permalinkString = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$headers = getallheaders();
$xSessionToken = "a " . $headers["X-Session-Token"] . " b";
// echo $headers['X-Session-Token'];exit(); //
$nonce = UtilsStatic::createNonceWithBodyData();
$curl = curl_init($this->apiURL . 'checkout?permalink=' . $permalinkString . '&nonce=2');
$requestHeaders = [
'Content-Type: application/json',
'Authorization: ' . $this->apiAuth,
'X-Session-Token: ' . $xSessionToken
];
// print_r($requestHeaders);exit();
// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
// curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $requestHeaders);
curl_setopt($curl, CURLOPT_POST, 1);
// curl_setopt($curl, CURLOPT_POSTFIELDS, $bodyData);
$checkout = json_decode(curl_exec($curl));
$info = curl_getinfo($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
http_response_code($httpcode);
return $checkout;
}
这是来自远程服务器的日志,显示接收到的值。它没有收到应该具有自定义标头的字符串部分。
CheckoutResource - X-Session-Token [a b]
现在真正奇怪的是,如果我们只是在那里设置一个字符串而不是从中加载自定义标题,getallheaders
我们只是将它设置为一个特定的值,它会按预期工作。我也尝试使用其他自定义标头,并且无论标头名称如何,都会发生同样的问题。
如果重要的话,我们可以完全控制用于处理标头的远程服务器,并且 php 脚本由 apache 提供。
编辑
根据要求,来自getAllHeaders
. 我可以打印标题并将其用作字符串,它只是没有在 curl 中发送。
Array
(
[Host] => local.menus.com
[Connection] => keep-alive
[Content-Length] => 504
[Pragma] => no-cache
[Cache-Control] => no-cache
[X-Session-Token] => o154fl5qt7ifqf67r3novits1q
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
[Content-type] => application/json
[Accept] => */*
[Origin] => http://localhost:8282
[Referer] => http://localhost:8282/
[Accept-Encoding] => gzip, deflate
[Accept-Language] => en-US,en;q=0.9,pt-BR;q=0.8,pt;q=0.7
)
解决方案
推荐阅读
- r - 在 R 中的 if-else 语句中使用大小不等的数据帧
- zurb-foundation - 为什么在跟随原始演示时 Foundation Magellan 不起作用?
- python - 无法从 FTP 下载文件
- git - 如何在 Git 命令中指定多个路径?
- mongodb - $lookup 多个级别
- mongodb - mongoDB upsert 查询
- angular - Angular:使用路由对延迟加载模块进行单元测试
- node.js - 带有 OpenID 的 Vuejs/Node/Express 会话 ID 工作流
- python - 获取符合python的所有双引号或单引号包围的字符串
- python - 如何在 put_object 中指定标记?