php - 网络机器人可以增加下载量吗?

标签 php html mysql

我有一个 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/

相关文章:

MySQL 如何使用具有关联 ID 的 DISTINCT 值

php - 如何从cakephp中的数据库表中获取id的值

php - .htaccess 拒绝除索引之外的所有 php 文件

javascript - Angular 验证必填字段 CSS

mySQL,网站统计: unique daily visits

php - 数据库选择和查询问题 - PHP

php - 使用 PDO 插入数据库

php - 通过 PHP/MySql 更新表数据

javascript - 动画和过渡同时进行?

javascript - 查询 : show div on clicking div