使用PHP和curl进行标头排序

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应该在头部之后发送(就像Web浏览器所做的那样),但在我的情况下,我不知道出了什么问题。您能帮忙吗?

谢谢

1个回答

1
为什么它应该在底部?
HTTP RFC声明,除其他外:
- 标题键的大小写没有重要性 - 标题的顺序无关紧要
所有这些都在RFC 2616(HTTP1.1)中非常清楚地说明:第31页:
引用如下:
接收具有不同字段名称的标题字段的顺序不重要。但是,“好的做法”是首先发送通用标题字段,然后是请求头或响应标题字段,最后是实体标题字段。
因此,尽管curl未生成您期望的输出,但它并没有做错任何事情。顺序是任意的,curl之所以这样做是因为它将首先处理cookie jar,然后允许您使用HEADERS设置在最后覆盖任何喜欢的标题。
因此,如果您的代码对标题顺序挑剔,则需要教您的代码不要担心它们,因为各种浏览器将发送不同的标题顺序。最终,在接收方上宽容,在发射方上严格。

“为什么”?因为他想要这种行为,并且他希望curl(伟大的通用http库)这样做。无序的标头可能会导致他的程序在某些网站上被阻止,例如伪装成Firefox的机器人。 - Accountant م

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接