PHP Curl -获取具有重复键的响应头

  • 本文关键字:响应 Curl 获取 PHP php curl
  • 更新时间 :
  • 英文 :


我很难解析响应头。返回的标头包含set-cookie名称的重复键,我试图与其他标头一起使用,但问题是它将set-cookie值覆盖到最后一个可用的。我知道我们不能在关联数组中有相同键的多个名称,在这种情况下,我应该使用什么来实现这个结果?

[16] => set-cookie: GPS=1; Domain=.youtube.com; Expires=Sat, 14-Aug-2021 15:09:33 GMT; Path=/; Secure; HttpOnly
[17] => set-cookie: YSC=HYwhlVWBBfQ; Domain=.youtube.com; Path=/; Secure; HttpOnly; SameSite=none
[18] => set-cookie: VISITOR_INFO1_LIVE=E2nuslFFVxI; Domain=.youtube.com; Expires=Thu, 10-Feb-2022 14:39:33 GMT; Path=/; Secure; HttpOnly; SameSite=none

脚本将永远继续,如果我包括while语句,如果我删除它,它工作正常,但只返回最后的set-cookie,即18

$url = "https://www.youtube.com";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_NOBODY, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$resp = curl_exec($curl);
curl_close($curl);
$h = array_filter(explode("n", $resp), 'trim');
$headers = [];
foreach ($h as $k => $v) {
$l = explode(": ", $v); // Desired keys values here.
if (strpos($v, 'HTTP') == true) {
$headers['Headers']['status'] = $l[0];
} elseif (strpos($v, 'set-cookie') !== false) {
// $headers['Headers']['Cookies'][]['set-cookie'] = $l[1]; Works but return each cookie as array
while (str_contains($v, 'set-cookie')) {
$headers['Headers']['set-cookie'] = $l[1];
}
} else {
$headers['Headers'][$l[0]] = $l[1];
}
}

使用下面的代码获得数组的原因是您正在使用:来爆炸头键,这也可以在cookie值的内容中使用。

您可以从索引1内爆初始的已爆炸数组,它应该工作得很好,所以代码将是:

$headers['Headers']['Cookies'][]['set-cookie'] = implode(':', array_slice($l, 1));

另一个解决方案是将set-cookie:替换为空字符串并使用它。

$headers['Headers']['Cookies'][]['set-cookie'] = str_replace("set-cookie:",'', $v);

最新更新