1

Drupal7のMU(マルチサイト)インストールが機能しており、コンテンツをロードする機会が得られるまで、受け取ったボットの群れを一時的に抑制しようとしています。Xpathで特定の基準が見つかった場合に、503ヘッダーを送信するための迅速で汚いスクリプトを作成しました(これは、DOMが形成されていない場合はstrpos / preg_matchとしても実行できます)。

どちらかを理解する必要がありますが、ボールを転がすために

A)Drupal7ブートストラップをハイジャックし、以下のこのフィルターを介してすべてのコンテンツをプルします

B)コンテンツがロードされる前にフィルターを介してコンテンツをob_flushする

価値のある言及私たちはドメインアクセスと呼ばれるモジュールを使用しています。これは、そもそもこのクレイジーな追跡に私を導いたと私は信じています。私はそれがかなりの数のファイルで混乱しているという事実を知っています...

私が抱えている問題は、コンテンツをどこでキャッチできるかを正確に把握することです。ストリームを変数にプッシュし、それをstrposしてから解放することは可能であるはずです、正しいですか?Drupal7のindex.phpが疑わしいと思いましたが、コンテンツをどこでどのようにキャプチャするかについて少し混乱しています。これがスクリプトです。うまくいけば、誰かが私を正しい方向に向けることができます。

//error_reporting(-1);

    /* start query */

    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = false;
    $dom->Load($_SERVER['PHP_SELF']);

    $xpath = new DOMXPath($dom);

        //if this exists we aren't ready to be read by bots
        $query = $xpath->query(".//*[@id='block-views-about-this-site-block']/div/div/div");
        //or $query = 'klat-badge'; //if this is a string not DOM

    /* end query */

if(strpos($query) !== false) { 

    //require banlist
    require('botlist.php'); 

    $str = strtolower('/'.implode('|', array_unique($list)).'/i'); 
    if(preg_match($str, strtolower($_SERVER['HTTP_USER_AGENT']))) {
        //so tell bots we're broken
        header('HTTP/1.1 503 Service Temporarily Unavailable');
        header('Status: 503 Service Temporarily Unavailable');
        exit;
    }
}
4

1 に答える 1

1

モジュールで定数を定義し、代わりにそれをチェックする方がはるかに簡単です。hook_init()次に、コンテンツが作成される前に、ページの準備ができているかどうかを判断するために使用できます。

define('IN_DEVELOPMENT', TRUE);

function mymodule_init() {
  if (IN_DEVELOPMENT) {
    //require banlist
    require('botlist.php'); 

    $str = strtolower('/'.implode('|', array_unique($list)).'/i'); 
    if(preg_match($str, strtolower($_SERVER['HTTP_USER_AGENT']))) {
      //so tell bots we're broken
      header('HTTP/1.1 503 Service Temporarily Unavailable');
      header('Status: 503 Service Temporarily Unavailable');
      exit;
    }
  }
}

ページのコンテンツ全体をにロードすることで、やりたいことを実行する方法があるかもしれませんが、DOMDocumentDrupalでは簡単ではなく(すでに発見していると思います!)、確かに効率的ではありません。

お役に立てば幸い

于 2011-11-17T08:53:20.107 に答える