我们在工作中安装了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;
}
}
答案 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中它并不容易(因为我相信你已经发现了!)并且当然效率不高
希望有所帮助