Unerwünschte Aufrufe blockieren oder umleiten

Das Weblication® Server-Monitoring gibt Ihnen Auskunft darüber, welche Aufrufe im Projekt stattfinden und bildet somit eine wichtige Grundlage, um z.B. unerwünschte Aufrufe zu blockieren oder umzuleiten.

Die BASE liefert Ihnen bereits im Standard eine Umsetzung, um unerwünschte Bots/Robots/Spider o.ä. zu blockieren.

Zusätzlich können Sie auch sehr individuell an globaler Stelle über die pre.php diverse Aufrufe blockieren oder umleiten, welche nicht erwünscht sind.

Beispiel 1: Nur pageId1 bis pageId9 zulassen, sonst umleiten

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
if(preg_match('/pageId\w\w+=/i', $_SERVER['QUERY_STRING'])){
wResponse::redirect($_SERVER['SCRIPT_NAME'], true);
}

Beispiel 2: Bot blockieren, wenn falsche Parameter gesendet werden

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
if(wRequest::isProbablyBot()){

//Falls ein Bot falsche Parameter sendet
if(strpos($_SERVER['QUERY_STRING'], 'NaN') !== false){
header('HTTP/1.1 400 Bad Request');
exit;
}
}

Beispiel 3: Aufrufe von "ExampleBot" blockieren

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
if(strpos($_SERVER['HTTP_USER_AGENT'], 'ExampleBot') !== false){
header('HTTP/1.1 400 Bad Request');
exit;
}

Beispiel 4: Aufrufe bestimmter / alter Pfade blockieren oder umleiten

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
if(preg_match('/\/alter-pfad\//', $_SERVER['REQUEST_URI'])){
// wenn blockiert werden soll:
header('HTTP/1.1 403 Forbidden');
header('Status: 403 Forbidden');
exit;
// wenn z.B. auf Startseite umgeleitet werden soll:
// wResponse::redirect('/IHR-PROJEKT/index.php', true);exit;
}

Beispiel 5: Diverse Aufrufe nur für diverse Bots blockieren

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
$queryUserAgents = preg_match('/bingbot|googlebot/i', $_SERVER['HTTP_USER_AGENT'])
&& (
preg_match('/redirectresize/i', $_SERVER['QUERY_STRING'])
||
preg_match('/firstletter/', $_SERVER['QUERY_STRING'])
||
preg_match('/pageid\w\w+=/', $_SERVER['QUERY_STRING'])
||
preg_match('/firstletter=.*firstletter=/i', $_SERVER['QUERY_STRING'])
||
preg_match('/\?\&+/', $_SERVER['REQUEST_URI'])
||
preg_match('/\&(\w+)=.*\&\1=/', '&'.$_SERVER['QUERY_STRING'], $matches))
;
if(
$queryUserAgents){
// wenn blockiert werden soll:
header('HTTP/1.1 403 Forbidden');
header('Status: 403 Forbidden');
exit;
// wenn z.B. auf Startseite umgeleitet werden soll:
// wResponse::redirect('/IHR-PROJEKT/index.php', true);exit;
}

Aufrufe werden mit einem Statuscode 403 quittiert, wenn:

  • der User-Agent bingbot oder googlebot enthält
    und
    • redirectresize im Querystring enthalten ist
      (Groß-/Kleinschreibweise wird nicht beachtet)
    • firstletter im Querystring enthalten ist
      (Groß-/Kleinschreibweise wird beachtet)
    • pageidXXX im Querystring enthalten ist
      (XXX steht für alphanummerische Zeichen, Groß-/Kleinschreibweise wird beachtet)
      In Projekten wird pageId mit großem I verwendet, womit es pageid nicht gibt.
    • firstletter zweimal im Querystring enthalten ist
      (Groß-/Kleinschreibweise wird beachtet)
    • ?& in der aufgerufenen URL enthalten ist
      (Groß-/Kleinschreibweise wird nicht beachtet)
    • wenn ein URL-Parameter mehrmals im Querystring enthalten ist


Beispiel 6: pageId-Parameter bei Bots nur einmal zulassen

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
// Lässt bei Bots nur die erste pageId durch
if(wRequest::isProbablyBot()){
$matches = array();

if(
preg_match('/[\?\&]*(pageId[^&]+)/i', $_SERVER['QUERY_STRING'], $matches)){
$firstPageId = $matches[1];
$queryStringNew = $_SERVER['QUERY_STRING'];
$queryStringNew = preg_replace('/&pageId[^&]+/i', '', '&'.$queryStringNew);
$queryStringNew .= '&'.$firstPageId;
$queryStringNew = preg_replace('/&+/', '&', $queryStringNew);
$queryStringNew = preg_replace('/^&/', '', $queryStringNew);
$queryStringNew = preg_replace('/&$/', '', $queryStringNew);
$_SERVER['REQUEST_URI'] = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']).'?'.$queryStringNew;
if(
$queryStringNew != $_SERVER['QUERY_STRING']){
wResponse::redirect($_SERVER['REQUEST_URI']);
}
}
}

Aufrufe werden bei erkannten Bots auf dieselbe URL mit nur dem ersten pageId-Parameter umgeleitet, wenn mehrere pageId-Parameter aufgerufen wurden.

Beispiel 7: selectedXXX-Parameter bei Bots komplett löschen

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
// Löscht bei Bots die selectedDay, selectedMonth, selectedYear Parameter
if(wRequest::isProbablyBot()){
$matches = array();
if(
preg_match('/[\?\&](selected(day|month|year)=[^&]+)/i', $_SERVER['QUERY_STRING'], $matches)){
$queryStringNew = $_SERVER['QUERY_STRING'];
$queryStringNew = preg_replace('/&selected(day|month|year)[^&]+/i', '', '&'.$queryStringNew);
$queryStringNew = preg_replace('/&+/', '&', $queryStringNew);
$queryStringNew = preg_replace('/^&/', '', $queryStringNew);
$queryStringNew = preg_replace('/&$/', '', $queryStringNew);
$_SERVER['REQUEST_URI'] = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']);
if(
$queryStringNew != $_SERVER['QUERY_STRING']){
wResponse::redirect($_SERVER['REQUEST_URI']);
}
}
}

Aufrufe werden bei erkannten Bots auf dieselbe URL ohne selectedXXX-Parameter umgeleitet.

Beispiel 8: Bot-Aufrufe mit diversen URL-Parametern blockieren

Beispiel: Auszug aus der pre.php

// nach Include der grid.php setzen
// Blookiert Bot-Aufrufe mit diversen URL-Paramtern
if(wRequest::isProbablyBot()){
if(
preg_match('/(selectedYear|selectedMonth|categoriesJobLocation|categoriesJobFunction|categoriesJobLevel|ajaxId|typeFilter|hash|values|cont|lang|projectPath|pageid|wsessionid|variant)/i', $_SERVER['QUERY_STRING'])){
header('HTTP/1.1 403 Forbidden');
header('Status: 403 Forbidden');
exit;
}
}

Aufrufe werden bei erkannten Bots mit den abgefragten URL-Parametern blockiert.