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;
    }
  }
}

可能有一种方法可以通过将整个页面内容加载到 a 中来完成您想要的操作,DOMDocument但在 Drupal 中这并不容易(我相信您已经发现了!)而且肯定效率不高。

希望有帮助

于 2011-11-17T08:53:20.107 回答