如果使用 cURL 或 Wget 访问页面,则在 PHP 中检测

pix*_*ets 3 php service curl wget

我有一个简单的 PHP 脚本,它向用户显示一些信息。如果使用 cURL 请求同一页面或使用 Wget 保存同一页面,我想尽可能地缩短此信息。

我在 Stackoverflow 上看到了几个类似的问题,但他们有一些额外的问题,比如“我想阻止 cURL ”或“如果……重定向表单请求”。答案通常表明不可能可靠地检测 cURL 请求,因为 cURL 允许用户更改所有请求参数并假装是浏览器。对我来说没关系,我不想阻止 cURL,我想为通用 cURL(和 Wget)请求提供额外的服务。

pix*_*ets 5

如果未配置,则 cURL 和 Wget 使用自定义 »User Agent« 字符串来处理它们的请求。

例如curl/7.47.0Wget/1.17.1 (linux-gnu)。您可以在 https://requestb.in 上轻松测试。

多个应用程序可以访问请求标头中的用户代理字符串。在 PHP 中,它在$_SERVER['HTTP_USER_AGENT']变量中可用。

因此,要检测 cURL 或 Wget 请求并提供不同的内容,您可以使用

<?php

// Catch cURL/Wget requests
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/^(curl|wget)/i', $_SERVER['HTTP_USER_AGENT'])) {
    echo 'Hi curl user!';
}
else {
    echo 'Hello browser user!';
}

?>
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我检测到 cURL 请求,然后让进程die()进入if循环。因此,如果它只是一个浏览器,则条件不匹配并执行以下所有 PHP 代码。

如前所述,cURL 和 Wget 都允许用户设置任意用户代理。但是对于请求的服务,这个解决方案就足够了。