网络机器人可以夸大下载次数吗?

时间:2017-08-08 02:29:40

标签: 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();
    }   
}

}

1 个答案:

答案 0 :(得分:1)

您的两个问题的答案都是

当抓取工具为您的网站编制索引时,它还会查找相关内容,类似于创建站点地图。它在页面上查找相关内容的第一个位置是直接链接。如果您直接在下载页面链接到您的文件,则抓取工具也会尝试索引这些链接。

阻止抓取工具看到包含robots.txt 的下载页面会阻止此问题,但随后您将失去潜在的SEO。如果第三方直接链接到您的下载怎么办?如果他们的他们的下载页面已编入索引,则您的链接仍会对抓取工具可见。

幸运的是,您可以禁用此行为。只需将以下内容添加到下载页面的<head>部分,告诉抓取工具下载页面上的链接都是 canonical 的链接:

<link rel="canonical" href="http://www.example.com/downloads" />

考虑到参数本质上是不同的“网页”,抓取工具会认为/downloads?file_id=1/downloads不同。添加上面的行会告诉他们它是同一页面,并且他们不需要打扰。

假设您有被索引的实际文件(例如PDF),您可以阻止抓取工具在.htaccesshttpd.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会更安全。

希望这有帮助! :)