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

希望這會有所幫助! :)