2011-11-17 47 views
1

我们在工作时在这里安装了Drupal7的MU(多站点),并且正在尝试 暂时阻止我们收到的机器人群,直到我们有机会加载我们的 内容。如果我们在Xpath中找到某个 条件(如果DOM没有形成,这也可以作为strpos/preg_match来完成),我写了一个快速且脏的脚本来发送503头文件。在页面加载前捕获Drupal7 DOM内容进行比较

为了让球滚动,虽然我需要通过之前的过滤器,以找出如何可以

A)劫持Drupal7引导,并通过该过滤器拉下面

B中的所有内容)使用ob_flush内容内容加载

值得一提的我们使用一个被称为域访问模块,我相信 使我在首位这个疯狂的追逐。我知道这样一个事实,它沾染了 与相当多的文件...

我遇到的问题是确切地搞清楚我在哪里可以赶上内容 在?应该可以将流推入一个变量,然后释放它,正确吗?我认为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

在模块中定义一个常量并检查它会容易得多。然后,您可以使用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中不会很容易(因为我相信你已经发现了!),当然效率不高。

希望能帮到

+0

这给了我一个很好的起点,还有值得一看的东西,谢谢。 – ehime

+0

由于某种原因,我无法获取模块捕获内容=(是否有我应该寻找的变量或某个应该缓冲的流? – ehime

相关问题