我正在使用Curl编写一个刮刀,我发现很多页面都包含多个重定向标题,例如:
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.0.4
Date: Thu, 17 Nov 2011 17:46:35 GMT
Transfer-Encoding: chunked
Location: http://secure.domain.net/track/NDg6MTE6MTU/?autocamp=TJ_ABC_VA_A02
HTTP/1.1 302 Found
Date: Thu, 17 Nov 2011 17:46:37 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: nats_cookie=Bookmark; expires=Fri, 18-Nov-2011 17:46:37 GMT; path=/; domain=domain.net
Set-Cookie: nats=MjYwNjk6MTE6MTU%2C0%2C0%2C0%2C0; expires=Sun, 27-Nov-2011 17:46:37 GMT; path=/; domain=domain.net
Set-Cookie: nats_sess=00e48c685c9acbb37fcc3b7461b1ab81; expires=Sat, 25-Feb-2012 17:46:37 GMT; path=/; domain=domain.net
Location: http://www.domain.net/tour/?nats=MjYwNjk6MTE6MTU,0,0,0,0&autocamp=TJ_ABC_VA_A02
Transfer-Encoding: chunked
Content-Type: text/html
HTTP/1.1 200 OK
Date: Thu, 17 Nov 2011 17:46:39 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: text/html
正如您所看到的,有两个带有“Location:”指令的标题。
我只是想知道他们为什么这样做。 仅仅包含一个标题是不够的?
重定向网址甚至不同, 那么哪一个是“真正的”登陆页面?
感谢。
答案 0 :(得分:1)
当CURLOPT_FOLLOWLOCATION和CURLOPT_HEADER都为true且发生了redirect / s时,curl_exec()返回的响应将按照遇到的顺序包含重定向链中的所有标题。
来源: http://php.net/manual/en/function.curl-setopt.php#103232
此外,如果在重定向链中的任何位置返回响应主体,它也将包含在curl_exec()的返回值中。
所以你可以收到类似的东西:
HEADER 1
HEADER 2
BODY 2
或
HEADER 1
HEADER 2
BODY 2
HEADER 3
BODY 3
如果您只想要上次重定向的响应标题和正文,请注意这一点。您需要从以前的重定向手动剥离标题和正文。
答案 1 :(得分:0)
您正在查看三个不同的请求,每个请求都有自己的标头集。第一个URL重定向到第二个,第二个重定向到第三个。您的浏览器必须下载三个页面才能获得目标网页的最终内容。他们为什么这样做呢?忽略额外的延迟,这主要增加了用户体验。根据URL,这是用于某种用户跟踪或统计目的,并且他们可能更容易在整个网站上强制浏览器而不是直接返回内容。