在页面加载之前捕获Drupal7 DOM内容以进行比较

时间:2011-11-17 01:45:31

标签: php dom drupal bootstrapping drupal-domain-access

我们在工作中安装了Drupal7的MU(多站点),并且正在努力 暂时阻止我们收到的一大堆机器人,直到我们有机会装载我们的机器人 内容。我写了一个快速而又脏的脚本来发送503标题,如果我们找到一个 Xpath中的标准(如果没有形成DOM,也可以作为strpos / preg_match完成)。

为了让球滚动,我需要弄清楚如何

A)劫持Drupal7引导程序并通过此过滤器下拉所有内容

B)在加载内容之前通过过滤器ob_flush内容

值得关注我们使用一个名为Domain Access的模块,我相信 首先让我开始疯狂追逐。我知道这个事实很混乱 有很多文件...

我遇到的问题是弄清楚我能抓住内容的确切位置 在?应该可以将流推入变量,移动它,然后释放它,正确吗?我认为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;
    }
}

1 个答案:

答案 0 :(得分: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;
    }
  }
}

通过将整个页面内容加载到DOMDocument中,可能有办法做你想要的事情,但在Drupal中它并不容易(因为我相信你已经发现了!)并且当然效率不高

希望有所帮助