Dem Benutzer (und den Suchmachinen) zeigen wo es lang geht
Es gibt in Typo3 viele Möglichkeiten das Template und die gesamte Seite zu erweitern und anzupassen. Es gibt Extensions, Typoscript und dann die Möglichkeit, Funktionen einer Klasse aus einer PHP-Datei direkt aus dem Typoscript auszuführen, durch das USER oder INT_USER Objekt. Mit diesen konnte ich nun eine mehrsprachige Typo3-Seite erfolgreich erweitern. Das Ziel war, die Spracheinstellung vom Browser zu lesen und den Benutzer auf die entsprechende Sprache der Seite weiter zu leiten. Dies soll aber nur passieren, wenn der Benutzer auf der Root-Seite landet. Um also eine entsprechende PHP-Klasse im Template einzubinden benutzt man folgendes Typoscript im Template-Setup:
// Zunächst die PHP-Datei laden
includeLibs.lang_redirect = fileadmin/libs/lang_redirect.php// Dann die userFunction ausführen, dies geschieht im PAGE-Objekt
seite.1 = USER_INT
seite.1.userFunc = user_301redirect->user_main
Dann fehlt natürlich nur noch die entsprechende lang_redirect.php Datei. Diese beinhaltet eine Funktion, die die Sprache des Browsers überprüft und eine Funktion, die die überprüft, ob der Zugriff auf die Seite durch einen Robot geschieht. Aus Gründen der Suchmachinenoptimierung wende ich diese Methode bei Robots nicht an, sondern geb direkt die Seite aus die angefragt wurde. Im Folgenden meine PHP-Datei.
class user_301redirect {
var $correctDomain = ‘www.domain.com’; // default domain
var $languages = array(‘en’,'de’); // 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 = 0; // 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 (($_SERVER['SCRIPT_URL'] == ” || $_SERVER['SCRIPT_URL'] == ‘/’) && strpos($_SERVER['HTTP_REFERER'],’http://’.$this->correctDomain) !== 0 && $this->checkRobot == ”) { // only if no manual domain like www.conject.com/index.php?id=3$newurl = $this->lang_getfrombrowser($this->languages, $this->languages[0], null, false, $this->languageForRobots); // add correct domain (with language variable
if (!empty($newurl)) { // only if set
// redirect to new domain via 301
header(‘HTTP/1.1 302 Found’);
header(‘Location: http://’.$this->correctDomain.’/’.$newurl);
header(‘Connection: close’);
exit();
}}
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 = ”;
$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
$l = strtolower(join (‘-’, $lang_code));
if ($l == $default_language)
$current_lang = ”;
else
$current_lang = $l;
$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 ”;
}
}}
[...] also zu meiner Lösung. Wie bereits in meinem letzten Beitrag benutze ich die Möglichkeit im Typoscript eine PHP-Datei auszuführen. Um von Seiten ohne www auf [...]
Weiterleitung von ohne www. auf mit www. – Die PHP-Lösung | Die Lösung vieler Typo3 Probleme!
10 Feb 10 at 13:57