2017-08-08 24 views
2

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

的回答您的两个问题是

当爬虫索引你的网站,它也查找相关内容,类似于建立一个网站地图。它在页面上查找相关内容的第一个地方是直接链接。如果您直接在下载页面上链接到您的文件,抓取工具也会尝试对这些链接进行索引。

防止抓取工具看到您的下载页面robots.txt防止这个问题,但你会失去潜在的搜索引擎优化。那么如果第三方直接链接到您的下载呢?如果他们的下载页面的索引为,那么您的链接仍将对抓取工具可见。

幸运的是,您可以禁用此行为。只是简单地告诉下载页面上的链接都canonical那些爬虫,通过添加以下到下载页面的<head>部分:

<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要安全得多。

希望这会有所帮助! :)