3

我正在使用以下 PHP 代码发送带有特定标头和 cookie 的 GET 请求:

$getheader = array(
    "Accept: text/html, application/xhtml+xml, */*",    
    "Accept-Language: en-US",
    "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",   
    "Accept-Encoding: gzip, deflate",
    "Host: mysite.com",
    "Connection: Keep-Alive"    
);


curl_setopt($ch, CURLOPT_URL, 'http://mysite.com');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $getheader);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); //read from the cookie
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

curl_exec($ch);

它工作正常,但标题以错误的顺序发送,如下所示:

GET http://mysite.com/ HTTP/1.1
Cookie: remember_me=1; id=9089018083 <------ this line should be at the end
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: mysite.com
Connection: Keep-Alive

cookie 应该在标题之后发送(就像网络浏览器所做的那样),但在我的情况下,我不知道出了什么问题。你能帮忙吗?

谢谢

4

1 回答 1

2

为什么“应该”在底部?

HTTP RFC 声明,除其他外:

  • 标题键的大小写无关紧要
  • 标题的顺序并不重要

所有这些都在 RFC 2616 (HTTP 1.1) 中非常清楚地说明:http ://www.ietf.org/rfc/rfc2616.txt ,第 31 页:

接收具有不同字段名称的头字段的顺序并不重要。但是,“好习惯”是先发送通用头字段,然后是请求头或响应头字段,最后是实体头字段。

因此,虽然 curl 没有产生您期望的输出,但它并没有做错任何事情。顺序是任意的,curl 这样做的原因是它会首先处理 cookie jar ,然后允许您在最后使用 HEADERS 设置覆盖您喜欢的任何标题。

所以,真的,如果你的代码对标题顺序很挑剔,你需要教你的代码不要担心它们,因为各种各样的浏览器会发送不同的标题顺序。归根结底,要从宽接待,从严排放。

于 2013-05-23T00:52:25.930 回答