Захват содержимого Drupal7 DOM перед загрузкой страницы для сравнения - PullRequest
1 голос
/ 17 ноября 2011

У нас есть MU (Multisite) установка Drupal7 здесь на работе, и мы пытаемся временно сдерживать рой ботов, которых мы получаем, пока у нас не будет возможности загрузить наши содержание. Я написал быстрый и грязный скрипт для отправки 503 заголовков, если мы найдем определенный критерии в Xpath (это также можно сделать как strpos / preg_match, если DOM не сформирован).

Для того, чтобы заставить мяч катиться, мне нужно выяснить, как либо

A) Взломайте загрузчик Drupal7 и вытяните весь контент через этот фильтр ниже

B) ob_flush содержимое через фильтр перед загрузкой содержимого

СТОИТ ПРОПИСАТЬСЯ Мы используем Модуль, который называется Доступ к домену, который, я считаю, привел меня в эту сумасшедшую погоню в первую очередь. Я точно знаю, что это путает довольно много файлов ...

Проблема, с которой я столкнулся, заключается в том, чтобы выяснить, где именно я могу поймать контент в? Должна быть возможность выдвинуть поток в переменную, strpos, затем освободить его, правильно? Я думал, что index.php в Drupal7 будет подозреваемым, но я немного запутался, где и как я должен захватить содержимое. Вот сценарий, и, надеюсь, кто-то может направить меня в правильном направлении.

//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 Ответ

1 голос
/ 17 ноября 2011

Было бы намного проще просто определить константу в модуле и проверить ее вместо этого.Затем вы можете использовать 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 это будет непросто (как я уверен, что вы уже обнаружили!) и, конечно, неэффективно.

Надеюсь, это поможет

...