2011-11-17 88 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