Anforderung:
Um Kontinuität und SEO auf die Seite zu bringen, ist es erforderlich alle Anfragen von www.domain.com/seite/seite.html auf die entsprechende lokalisierte Sprache (via 301) zu bringen www.domain.com/de/seite/seite.html
Idee:
Eine kleine userFunc auf allen Seiten:
- Leitet auf die entsprechende Browsersprache
- Wenn eine Sprache nicht definiert ist, soll Standardsprache benutzt werden
- Falls robot oder spider kommt, soll eine vordefinierte Sprache genommen werden
- Keine Weiterleitung wenn Sprachparameter gesetzt ist
- Falls zu Testzwecken eine URL mit index.php aufgerufen wird, nicht weiterleiten
- Wenn mehrere Domains verwendet werden (domain.com, domain.de, domain.at), Weiterleitung auf Hauptdomain (via 301)
Umsetzung:
- Einbindung der userFunc auf jeder Seite über TS:
includeLibs.user_301redirect = fileadmin/user_301redirect.php
page.1 = USER_INT
page.1.userFunc = user_301redirect->user_main
- Anlegen der entsprechenden Datei (z.B.) fileadmin/user_301redirect.php:
<?php
class user_301redirect {
var $correctDomain = 'www.domain.com'; // default domain
var $languages = array('en','de',4 => 'ru'); // L=0 => en, L=1 => de (Attention: the first is default if no defined language could be read!)
var $languageForRobots = 'de'; // language for visiting robot
var $index2html = 1; // domain.de/page/index.html => domain.de/page.html redirect
var $debugmode = 0; // enable or disable debugmode (redirect or only print of the new url)
// Main function for 301 redirect of old or wrong URIs
function user_main($content='', $conf=array()) {
// config
$newurl = '';
if (strpos($_SERVER['REQUEST_URI'], 'index.php') === false) { // only if no manual domain like www.conject.com/index.php?id=3
// Let's go
if ($_GET['L'] == '' || $_SERVER['SERVER_NAME'] != $this->correctDomain || strpos($_SERVER['REQUEST_URI'], '/index.html') !== false) { // if wrong url OR no language variable set
if ($_GET['L'] == '') { // no language variable set, so add one
$newurl = 'http://' . $this->correctDomain . '/' . $this->lang_getfrombrowser($this->languages, $this->languages[0], null, false, $this->languageForRobots) . $_SERVER['REQUEST_URI']; // add correct domain (with language variable
} else { // language variable set, so redirect only to www.conject.com
$newurl = 'http://' . $this->correctDomain . $_SERVER['REQUEST_URI']; // add correct domain (without language variable
}
if (strpos($newurl, '/index.html') !== false && $this->index2html) { // if there is an /index.html within the url AND redirect active
$newurl = str_replace('/index', '', $newurl); // replace /index with nothing
}
}
if (!empty($newurl)) { // only if set
if ($this->debugmode != 1) { // if no debugmode
// redirect to new domain via 301
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$newurl);
header('Connection: close');
} else { // if debugmode active
echo $newurl; // only show url
}
}
}
return false; // always return nothing
}
// Function lang_getfrombrowser() gets the language variable
function lang_getfrombrowser ($allowed_languages, $default_language, $lang_variable = null, $strict_mode = true, $lang_robot = 'de') {
if ($this->checkRobot() == false) { // no robot is visiting
// use $_SERVER['HTTP_ACCEPT_LANGUAGE'] if no lang variable
if ($lang_variable === null) {
$lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
}
// are there any information
if (empty($lang_variable)) {
// NO? => use default lang
return $default_language;
}
// Split header
$accepted_languages = preg_split('/,\s*/', $lang_variable);
// Default values
$current_lang = $default_language;
$current_q = 0;
// One loop for every lang
foreach ($accepted_languages as $accepted_language) {
// Get all infos about lang
$res = preg_match ('/^([a-z]{1,8}(?:-[a-z]{1,8})*)'.'(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $accepted_language, $matches);
// Sytax correct
if (!$res) {
// No - so ignore
continue;
}
// Sprachcode holen und dann sofort in die Einzelteile trennen
$lang_code = explode ('-', $matches[1]);
// Wurde eine Qualität mitgegeben?
if (isset($matches[2])) {
// die Qualität benutzen
$lang_quality = (float)$matches[2];
} else {
// Kompabilitätsmodus: Qualität 1 annehmen
$lang_quality = 1.0;
}
// Bis der Sprachcode leer ist...
while (count ($lang_code)) {
// mal sehen, ob der Sprachcode angeboten wird
if (in_array (strtolower (join ('-', $lang_code)), $allowed_languages)) {
// Check quality
if ($lang_quality > $current_q) {
// use this lang
$current_lang = strtolower (join ('-', $lang_code));
$current_q = $lang_quality;
// Stop while loop
break;
}
}
// Don't minimalize language if in strict mode
if ($strict_mode) {
// stop while loop
break;
}
// deactivate right part of the language code
array_pop ($lang_code);
}
}
} else { // if robot is visiting
$current_lang = $lang_robot; // robot language
}
return $current_lang;
}
// Function checkRobot() checks if visiter is a robot
function checkRobot() {
$trackUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
if (stristr($trackUserAgent ,"archiver")) $trackrobot = "Alexa";
if (stristr($trackUserAgent ,"exabot")) $trackrobot = "Exalead";
if (stristr($trackUserAgent ,"fast")) $trackrobot = "Fast";
if (stristr($trackUserAgent ,"firefly")) $trackrobot = "Fireball";
if (stristr($trackUserAgent ,"googlebot")) $trackrobot = "Google";
if (stristr($trackUserAgent ,"msnbot")) $trackrobot = "MSN";
if (stristr($trackUserAgent ,"architextspider")) $trackrobot = "Excite";
if (stristr($trackUserAgent ,"scooter")) $trackrobot = "Altavista";
if (stristr($trackUserAgent ,"lycos_spider")) $trackrobot = "Lycos";
if (stristr($trackUserAgent ,"slurp")) $trackrobot = "Yahoo";
/* Own entries */
if (stristr($trackUserAgent ,"nagios")) $trackrobot = "Nagios";
if (stristr($trackUserAgent ,"robot")) $trackrobot = "Robot";
if (stristr($trackUserAgent ,"crawl")) $trackrobot = "Crawler";
if (stristr($trackUserAgent ,"gigabot")) $trackrobot = "GigaBot";
if (stristr($trackUserAgent ,"echo!")) $trackrobot = "EchO!";
if (stristr($trackUserAgent ,"baiduspider")) $trackrobot = "BaiDuSpider";
if (stristr($trackUserAgent ,"askjeeves")) $trackrobot = "AskJeeves";
if (stristr($trackUserAgent ,"turnitin")) $trackrobot = "Turn It In";
if (stristr($trackUserAgent ,"speedyspider")) $trackrobot = "Speedy Spider";
if (stristr($trackUserAgent ,"bot/")) $trackrobot = "Bot";
if (stristr($trackUserAgent ,"bot-")) $trackrobot = "Bot";
if (stristr($trackUserAgent ,"psbot")) $trackrobot = "PS Bot";
if (stristr($trackUserAgent ,"thepythonrobot")) $trackrobot = "The Python Robot";
if (stristr($trackUserAgent ,"voila")) $trackrobot = "Voila";
if (stristr($trackUserAgent ,"bspider")) $trackrobot = "BSpider";
if (stristr($trackUserAgent ,"surveybot")) $trackrobot = "SurveyBot";
if (stristr($trackUserAgent ,"grub.org")) $trackrobot = "Grub.org";
if (stristr($trackUserAgent ,"alexa")) $trackrobot = "Alexa";
if (stristr($trackUserAgent ,"arks")) $trackrobot = "Arks";
if (stristr($trackUserAgent ,"spider")) $trackrobot = "Spider";
if (stristr($trackUserAgent ,"yandex")) $trackrobot = "Yandex bot";
if (stristr($trackUserAgent ,"holmes")) $trackrobot = "Holmes";
/* Own entries end */
if ($trackrobot != "") {
return $trackrobot;
} else {
return FALSE;
}
}
}
?>
Einsatz:
Auf der Seite http://www.conject.com (bzw. www.conject.de)
Abschließendes:
- Vielleicht gibt es schon eine Extension die das alles kann, ich habe keine auf die Schnelle entdecken können.
- Am Anfang der PHP Klasse müssen/können die Einstellungen vorgenommen werden (Sprachen, Domain, Defaultsprache, Spidersprache, Debugmode)
- Grüße aus München