PHP - cURL 在跟踪重定向时应该设置'AUTOREFERER'吗?



TL;DR

为什么应该不应该I在cURL函数中设置CURLOPT_AUTOREFERER => true(遵循有限数量的重定向)?

长(er)版本

我有一个非常标准的cURL函数,它返回给定URL的标头,遵循多达10个重定向。。。

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:标头字段,该字段位于Location:redirect 之后

那又怎样?为什么这很重要?我应该把它放进去还是扔出去?这会导致某些URL的结果不同吗?某些域是否会返回错误的标头,就像我发送空用户代理时一样?

接着,接着…

我发现的大多数制作该函数的示例都不包括它,但它们也不包括我包含的许多其他选项。

首先确定一些基本信息:根据维基百科:

HTTP referr(最初是referrer的拼写错误)是一个HTTP头字段,用于标识链接到所请求资源的网页地址(即URI或IRI)。通过检查引用人,新网页可以看到请求的来源。在最常见的情况下,这意味着当用户点击网络浏览器中的超链接时,浏览器会向持有目的网页的服务器发送请求。该请求包括referer字段,该字段指示用户所在的最后一个页面(即他们单击链接的页面)。推荐人日志记录用于允许网站和网络服务器识别人们访问它们的位置,用于促销或统计目的。

但是这里有一个重要的细节。此标头由客户端提供,客户端可以选择提供,也可以选择不提供。此外,如果客户端选择提供,则客户端可以提供所需的任何值。

正因为如此,开发人员已经学会了除了统计数据之外,不要真正依赖他们获得的referrer值,因为它很容易被欺骗(如果你愿意,你实际上可以在cURL调用中自己设置referrer头,而不是使用CURLOPT_AUTOREFERER)。

因此,在使用爬网程序或cURL时提供它通常是无关紧要的。如果你想让远程网站知道你来自哪里,这取决于你。无论哪种方式,它都应该仍然有效。

话虽如此,一个网站根据引用人呈现不同的结果并非不可能,例如,我看到一个网站正在检查引用人是否是谷歌,以便提供额外的站内搜索结果,但这是例外,而不是规则,除此之外,这些网站无论如何都应该是可用的。

最新更新