PHP Curl-修改cookie而不是添加新cookie

PHP Curl-修改cookie而不是添加新cookie,php,curl,cookies,Php,Curl,Cookies,我得到了一个opencurl会话,它设置了cookie文件,所以它可以记住会话id(从登录中)。但是我现在如何修改这些cookies呢 curl_setopt($curl, CURLOPT_HTTPHEADER, array('Cookie:blabla=bleble')); 似乎操作不正确,因为它添加了另一个Cookie头,因此,例如,如果我有两个请求头: ... Cookie:blabla=uhuhu;tralala=ahahaha ... 我运行这个: curl_setopt($cur

我得到了一个opencurl会话,它设置了cookie文件,所以它可以记住会话id(从登录中)。但是我现在如何修改这些cookies呢

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Cookie:blabla=bleble'));
似乎操作不正确,因为它添加了另一个
Cookie
头,因此,例如,如果我有两个请求头:

...
Cookie:blabla=uhuhu;tralala=ahahaha
...
我运行这个:

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Cookie:blabla=bleble'));
它将简单地添加另一个具有相同变量但不同值的
Cookie
头:

...
Cookie:blabla=uhuhu;tralala=ahahaha
...
Cookie:blabla=bleble
那么,如何修改现有Cookie而不是添加另一个
Cookie
头呢

例如,当我登录到站点时,将会话cookie保存在文件中,在第二个请求中,我希望替换它,我得到如下内容(正在发送):

替换为
CURLOPT_HTTPHEADER

POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=YHGDba31faykfyTJraQMewP+
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:n1psjUEjqs5j7Bb5vvT0J3wXMunQ2e8c3ksb5Uikcdt9Ct1XOJUmAh8azkOqmMqe
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Cookie:46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Length: 73
POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=FHjCFhn/VKgkC09y7772fXpp; 46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:VCtJDc4PrVjybyFcw8jGAc3anO5mXm7GPnfgn8VES54TqwUKr4fP68PhJHtuSn2x
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Content-Length: 73
curl_setopt($curl,CURLOPT_HTTPHEADER,'Cookie:46db1eb1/sessiond=blablabla;46db1eb1/zoom accessibility=small')

POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=YHGDba31faykfyTJraQMewP+
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:n1psjUEjqs5j7Bb5vvT0J3wXMunQ2e8c3ksb5Uikcdt9Ct1XOJUmAh8azkOqmMqe
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Cookie:46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Length: 73
POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=FHjCFhn/VKgkC09y7772fXpp; 46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:VCtJDc4PrVjybyFcw8jGAc3anO5mXm7GPnfgn8VES54TqwUKr4fP68PhJHtuSn2x
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Content-Length: 73
正如你所看到的,饼干是加倍的

替换为
CURLOPT_COOKIE

POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=YHGDba31faykfyTJraQMewP+
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:n1psjUEjqs5j7Bb5vvT0J3wXMunQ2e8c3ksb5Uikcdt9Ct1XOJUmAh8azkOqmMqe
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Cookie:46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Length: 73
POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=FHjCFhn/VKgkC09y7772fXpp; 46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:VCtJDc4PrVjybyFcw8jGAc3anO5mXm7GPnfgn8VES54TqwUKr4fP68PhJHtuSn2x
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Content-Length: 73
curl_setopt($curl,CURLOPT_COOKIE,'46db1eb1/sessid=blablabla;46db1eb1/zoom accessibility=small')

POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=YHGDba31faykfyTJraQMewP+
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:n1psjUEjqs5j7Bb5vvT0J3wXMunQ2e8c3ksb5Uikcdt9Ct1XOJUmAh8azkOqmMqe
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Cookie:46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Length: 73
POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Host: 192.168.1.1
Accept: */*
Cookie: 46db1eb1/sessid=FHjCFhn/VKgkC09y7772fXpp; 46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8
X-Context:VCtJDc4PrVjybyFcw8jGAc3anO5mXm7GPnfgn8VES54TqwUKr4fP68PhJHtuSn2x
X-Prototype-Version:1.7
X-Requested-With:XMLHttpRequest
Referer:http://192.168.1.1/advConfigAccessType.html
Content-Length: 73
值在同一cookie标头中加倍


curl 7.26.0,Raspbian(Debian 7.8)您可以操作
CURLOPT_COOKIEJAR
文件。大概是这样的:

<?php
function init($f)
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "http://localhost/a.php");
    curl_setopt($curl, CURLOPT_COOKIEJAR, $f);
    curl_setopt($curl, CURLOPT_COOKIEFILE, $f);
    return $curl;
}
function readCookies($f)
{
    $cookies = [];
    if (($handle = fopen($f, "r")) !== FALSE) {
        while (($cookie = fgetcsv($handle, 1000, "\t")) !== FALSE) {
            $cookies[] = $cookie;
        }
        fclose($handle);
    }
    return $cookies;
}
function writeCookies($f, $c)
{
    $fp = fopen($f, "w");

    foreach ($c as $cookie) {
        fputcsv($fp, $cookie, "\t");
    }

    fclose($fp);
}

$f = './c.tmp';
$curl = init($f);
curl_exec($curl);

// playing with cookies:
$newCookie = ['blabla', '123'];
$cookies = readCookies($f);
if (!empty($cookies)) {
    $found = false;
    foreach($cookies as $key=>$val) {
        // ignore comments and empty lines
        if (count($val) == 7) {
            if ($val[5] == $newCookie[0]) {
                $found = $key;
                break;
            }
        }
    }
    if ($found) {
        $cookies[$found][6] = $newCookie[1];
    } else {
        // I am using first one as a template,
        // but you may need to set all fields explicitly
        // as they may differ
        $cookie = $cookies[0];
        $cookie[5] = $newCookie[0];
        $cookie[6] = $newCookie[1];
        $cookies[] = $cookie;
    }
    writeCookies($f, $cookies);
}

$curl = init($f);
if (empty($cookies)) {
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Cookie:blabla=123'));
}
curl_exec($curl);

哪个系统?我无法在Mac上用PHP5.5和curl 7.37复制它,同样在Ubuntu上用PHP5.5+curl 7.35测试-last
curl_setopt
覆盖了Raspbian(Debian 7.8)上以前的cookie headercurl 7.26.0(arm未知linux gnueabihf)libcurl/7.26.0 OpenSSL/1.0.1e zlib/1.2.7 libidn/1.25 libssh2/1.4.2 librtmp/2.3。你确定它会覆盖它吗?你是从网站上得到cookie而不是第一次手动设置的吗?评论有点有限,请看我的答案我是如何测试的。也许PHP就是这样解释的。。。但是你能直接检查一下CURL发送的是什么吗?如下所示:
$headerSent=curl\u getinfo($curl,CURLINFO\u HEADER\u OUT);印刷(海德森)确实如此。通过tcpdump检查,它确实发送多个cookie头=(。我用可能的解决方案更新了答案。