PHP - cURL 在遵循重定向时应该设置“AUTOREFERER”吗?

Bir*_*rel 0 php http-referer curl

长话短说

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

长版

我有一个非常标准的 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;
}
Run Code Online (Sandbox Code Playgroud)

该功能getHeaders运行良好,完全符合预期。但到目前为止,在我的测试中,无论我是否包含在内,性能或结果都没有差异CURLOPT_AUTOREFERER => true。有很多参考资料说明了它的作用,但除此之外,我找不到任何更深入地讨论该特定选项的内容。CURLOPT_AUTOREFERER

好的,所以设置 `` 将会

...自动设置 HTTP 请求中的 Referer: 标头字段,其中跟随 Location: 重定向

所以呢?为什么这很重要?我应该把它留在里面还是扔掉?是否会导致某些 URL 的结果不同?某些域是否会返回错误的标头,就像我发送空用户代理时一样?

继续,继续……

我发现的大多数实现此功能的示例都没有包含它 - 但它们也没有包含我所包含的许多其他选项。

apo*_*fos 5

首先了解一些基本信息:根据维基百科:

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

然而,这里有一个重要的细节。该标头由客户端提供,客户端可以选择提供或不提供。此外,如果客户选择提供它,那么客户可以提供它想要的任何值。

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

因此,在使用爬虫或 cURL 时提供它通常是无关紧要的。如果您想让远程站点知道您来自哪里,这取决于您。不管怎样它应该仍然有效。

话虽这么说,网站根据引荐来源网址呈现不同的结果并非不可能,例如,我见过一个网站正在检查引荐来源网址是否为 Google,以便提供额外的站内搜索结果,但这是例外而不是规则,除了网站应该始终可用之外。