2017-08-08 12 views
2

私はPHPプログラムをウェブサイト上のMYSQLデータベースに接続しています。 リンクをクリックしてファイルをダウンロードすると、プログラムはデータベースから整数フィールドを読み取り、それを増分してから番号を戻してダウンロード数を数えます。そのプログラムは動作します。しかし、ダウンロード数は時間の経過と共に適度に膨らんでいるようです。ウェブロボットがダウンロード数を膨らませることはできますか?

リンクをたどってファイルをダウンロードすると、ダウンロード数はWebロボットによって増分されますか?もしそうなら、ウェブロボットにウェブサイト上のダウンロードページを無視し、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とすればとなりますが、潜在的なSEOを失うことになります。また、サードパーティがダウンロードに直接リンクしている場合はどうなりますか?彼らにダウンロードページがある場合、あなたのリンクは引き続きクローラに見えます。

幸運なことに、はこの動作を無効にすることができます。パラメータを考慮

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

クローラがする、本質的に異なる「ページ」であり:単にダウンロードページ上のリンクがダウンロードページの<head>セクションに以下を追加することで、すべてのcanonicalものですクローラに伝えます/downloads?file_id=1/downloadsと異なると考えてください。上記の行を追加すると、同じページであり、気にする必要がないことが通知されます。 フォールバック、あなたは可能性として

<Files ~ "\.pdf$"> 
    Header set X-Robots-Tag "noindex, nofollow" 
</Files> 

あなたは(PDFなど)インデックス付けされている実際ファイルを持っていると仮定すると、あなたの.htaccessまたはhttpd.confでそれらをインデックスからクローラを防ぐことができます誰が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は、$_GET$_POST$_COOKIEの両方を組み合わせていますが、どちらかといえば異なる傾向があります。これはtechnically secureですが、データを取得するだけの場合は、リクエストを単純な0​​に限定するほうがはるかに安全です。

希望すると便利です。 :)

関連する問題