TL; DR
为什么应该或不应该我在我的cURL函数中设置CURLOPT_AUTOREFERER => true
(在有限数量的重定向之后)?
长(呃)版本
我有一个非常标准的cURL函数,可以在 up-to 10重定向后返回给定URL的标题...
const SINGLETIMEOUT = 8; // Seconds (is this too long?)
public static function getHeaders($url, $userAgent) {
// Initialize cURL object
$curl = curl_init($url);
// Set options
curl_setopt_array($curl, array(
CURLOPT_USERAGENT => $userAgent,
CURLOPT_HEADER => true,
CURLOPT_NOBODY => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_AUTOREFERER => true,
CURLOPT_TIMEOUT => SINGLETIMEOUT, // 5 seconds (safety!)
CURLOPT_CONNECTTIMEOUT => SINGLETIMEOUT
));
// Run it
curl_exec($curl);
// Get headers
$headers = curl_getinfo($curl);
// Close it
curl_close($curl);
return $headers;
}
函数getHeaders
效果很好,完全符合预期。但到目前为止,在我的测试中,无论是否包含CURLOPT_AUTOREFERER => true
,性能或结果都没有差异。有很多参考资料说CURLOPT_AUTOREFERER
做什么 ,但除此之外,我找不到任何有关该特定选项的更深入内容。
好的,所以设置``将
...在HTTP请求中自动设置Referer:header字段,它位于Location:redirect
之后
那又怎样?为什么这很重要?我应该保留还是扔掉它?是否会导致某些网址的结果不同?某些域是否会返回错误的标头,与发送空用户代理时相同?
然后继续......
我发现使用此功能的大多数示例都没有包含它 - 但它们也没有包含我所包含的许多其他选项。
答案 0 :(得分:1)
首先确定一些基本信息:根据维基百科:
HTTP引用器(最初是引用者的拼写错误)是HTTP头字段,其标识链接到所请求的资源的网页的地址(即,URI或IRI)。通过检查引荐来源,新网页可以查看请求的来源。 在最常见的情况下,这意味着当用户单击Web浏览器中的超链接时,浏览器向持有目标网页的服务器发送请求。该请求包括referer字段,该字段指示用户所在的最后一页(他们点击该链接的页面)。 引用日志记录用于允许网站和Web服务器识别人们访问它们的位置,用于促销或统计目的。
然而,这是一个重要的细节。此标头由客户端提供,客户端可以选择提供它,也可以选择不提供它。此外,如果客户选择提供它,那么客户可以提供它想要的任何价值。
由于这种情况,开发人员已经学会了不依赖于除了统计之外的其他任何值所引用的引用值,因为它可以轻易被欺骗(如果你想要的话,你可以在cURL调用中自己设置referer头而不是使用CURLOPT_AUTOREFERER
)。
因此,在使用爬虫或cURL时提供它通常是无关紧要的。如果你想让远程站点知道你来自哪里,这取决于你。它应该仍然可以工作。
据说,一个网站根据引用者提供不同的结果并非不可能,例如我看到一个网站正在检查引用者是否是谷歌以提供额外的现场搜索结果,但是这个是例外,而不是规则,除此之外,网站应始终可用。