我有一个 PHP 程序连接到网站上的 MYSQL 数据库。 单击链接下载文件后,程序会从数据库中读取一个整数字段,将其递增,然后将数字放回原处,以计算下载次数。该程序有效。然而,随着时间的推移,下载次数似乎有所增加。
网络机器人是否可以通过链接下载文件来增加下载次数?如果是这样,是否可以使用 robots.txt 文件告诉网络机器人忽略网站上的下载页面,从而解决夸大的计数问题?
这是 PHP 代码:
function updateDownloadCounter($downloadPath, $tableName, $fileNameField, $downloadCountField, $idField)
{
require("v_config.php");
if(isset($_REQUEST["file_id"]) && is_numeric($_REQUEST["file_id"])) {
try
{
$sql = "SELECT * FROM " . $tableName . " WHERE file_id = " . $_REQUEST[$idField];
$connection = new PDO($dsn, $username, $password, $options);
$statement = $connection->prepare($sql);
$statement->execute();
$result = $statement->fetchAll();
if ($result && $statement->rowCount() == 1)
{
foreach ($result as $row)
{
if(is_file($_SERVER['DOCUMENT_ROOT'].$downloadPath . $row[$fileNameField]))
{
$count = $row[$downloadCountField] + 1;
$sql = "UPDATE " . $tableName . " SET " . $downloadCountField . " = " . $count . " WHERE file_id = " . $_REQUEST[$idField];
$statement = $connection->prepare($sql);
$statement->execute();
$documentLocationAndName = $downloadPath . $row[$fileNameField];
header('Location:' . $documentLocationAndName);
}
}
}
}
catch(PDOException $error)
{
echo $sql . "<br>" . $error->getMessage();
}
}
}
最佳答案
您的两个问题的答案都是是。
当抓取工具为您的网站编制索引时,它还会查找相关 内容,类似于创建站点地图。它在页面上寻找相关内容的第一个地方是直接链接。如果您直接在下载页面上链接到您的文件,抓取工具也会尝试为这些链接编制索引。
使用 robots.txt
防止爬虫看到您的下载页面会防止这个问题,但你会失去潜在的搜索引擎优化。如果第三方直接链接到您的下载怎么办?如果他们已将他们的 下载页面编入索引,您的链接仍将对抓取工具可见。
幸运的是,您可以禁用此行为。简单的告诉爬虫下载页面的链接都是 canonical 的,通过将以下内容添加到 <head>
下载页面部分:
<link rel="canonical" href="http://www.example.com/downloads" />
考虑到参数本质上是不同的“页面”,爬虫会认为/downloads?file_id=1
不同于 /downloads
.添加以上行将通知他们这是同一个页面,他们不需要打扰。
假设您有正在编入索引的实际文件(例如 PDF),您可以阻止爬虫在您的 .htaccess
中将它们编入索引或 httpd.conf
:
<Files ~ "\.pdf$">
Header set X-Robots-Tag "noindex, nofollow"
</Files>
作为后备,您始终可以检查谁在尝试在 PHP 本身中下载文件!这取决于您希望变得多迂腐(因为有很多 不同的爬虫),但此功能运行良好:
function bot_detected() {
return (
isset($_SERVER['HTTP_USER_AGENT'])
&& preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT'])
);
}
然后在运行 try
之前简单地将其作为条件调用:
if (!bot_detected()) {
try { } // Will only get executed for real visitors
}
此外,顺便说一句,我建议使用 $_GET["file_id"]
在 $_REQUEST["file_id"]
. $_REQUEST
联合收割机 $_GET
与$_POST
和 $_COOKIE
, 往往以不同的方式使用。虽然这是 technically secure如果您只是检索数据,将请求限制为简单的 $_GET
会更安全.
希望对您有所帮助! :)
关于php - 网络机器人可以增加下载量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45558377/