TYPO3-Testaccount
Testen Sie die aktuelle TYPO3 Version 4.4.2 kostenlos und unverbindlich für einen Monat!

jetzt testen

Schulungen

jetzt buchen

Automatische Weiterleitung (301) auf Browsersprache


Autor Nachricht
Verfasst am: 12. 08. 2008 [11:53]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8534
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:
TYPOSCRIPT
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
<?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&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Alexa";
			if (stristr($trackUserAgent ,"exabot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Exalead";
			if (stristr($trackUserAgent ,"fast&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Fast";
			if (stristr($trackUserAgent ,"firefly&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Fireball";
			if (stristr($trackUserAgent ,"googlebot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Google";
			if (stristr($trackUserAgent ,"msnbot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "MSN";
			if (stristr($trackUserAgent ,"architextspider&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Excite";
			if (stristr($trackUserAgent ,"scooter&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Altavista";
			if (stristr($trackUserAgent ,"lycos_spider&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Lycos";
			if (stristr($trackUserAgent ,"slurp&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Yahoo";
 
			/* Own entries */
			if (stristr($trackUserAgent ,"nagios&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Nagios";
			if (stristr($trackUserAgent ,"robot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Robot";
			if (stristr($trackUserAgent ,"crawl&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Crawler";
			if (stristr($trackUserAgent ,"gigabot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "GigaBot";
			if (stristr($trackUserAgent ,"echo!&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "EchO!";
			if (stristr($trackUserAgent ,"baiduspider&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "BaiDuSpider";
			if (stristr($trackUserAgent ,"askjeeves&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "AskJeeves";
			if (stristr($trackUserAgent ,"turnitin&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Turn It In";
			if (stristr($trackUserAgent ,"speedyspider&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Speedy Spider";
			if (stristr($trackUserAgent ,"bot/&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Bot";
			if (stristr($trackUserAgent ,"bot-&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Bot";
			if (stristr($trackUserAgent ,"psbot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "PS Bot";
			if (stristr($trackUserAgent ,"thepythonrobot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "The Python Robot";
			if (stristr($trackUserAgent ,"voila&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Voila";
			if (stristr($trackUserAgent ,"bspider&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "BSpider";
			if (stristr($trackUserAgent ,"surveybot&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "SurveyBot";
			if (stristr($trackUserAgent ,"grub.org&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Grub.org";
			if (stristr($trackUserAgent ,"alexa&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Alexa";
			if (stristr($trackUserAgent ,"arks&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Arks";
			if (stristr($trackUserAgent ,"spider&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Spider";
			if (stristr($trackUserAgent ,"yandex&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Yandex bot";
			if (stristr($trackUserAgent ,"holmes&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />) $trackrobot = "Holmes";
			/* Own entries end */
 
			if ($trackrobot != "&quot<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" /> {
				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

ProfilWWW
Verfasst am: 03. 09. 2008 [13:59]
bruder_chang
Dabei seit: 06.06.2006
Beiträge: 36
Wow, das klingt ja super!

Doch funktioniert das auch, wenn man realurl im Einsatz hat?
Und wie genau müsste die Sprachen-Zeile (6) angepasst werden, wenn man Englisch (L=0), Chinesisch (L=1) und Japanisch (L=3) im System hat?
Es wäre natürlich schön, wenn
www.domain.com/zielseite
dann automatisch bei z.B. chinesischer Browser-Sprache auf
www.domain.com/zh/zielseite
springen würde...
Oder ist das eine ganz andere Geschichte?

Thx,
Bruder Chang

"Herr Kommissar, Ihre Waffe, bitte." - "Ich brauche keine Waffe. Ich ermittle AUSSCHLIEßLICH mit dem Gehirn!"
Profil
Verfasst am: 03. 09. 2008 [14:08]
einpraegsam.net
Moderator
Themenersteller
Dabei seit: 17.01.2005
Beiträge: 8534
bruder_chang schrieb:

Doch funktioniert das auch, wenn man realurl im Einsatz hat?


logisch!


bruder_chang schrieb:

Und wie genau müsste die Sprachen-Zeile (6) angepasst werden, wenn man Englisch (L=0), Chinesisch (L=1) und Japanisch (L=3) im System hat?


PHP
var $languages = array('en','cn',3 => 'jp');
var $languageForRobots = 'en';


Aber ohne Gewähr, müsste ich mir selbst erst mal anschauen...


bruder_chang schrieb:

Es wäre natürlich schön, wenn
www.domain.com/zielseite
dann automatisch bei z.B. chinesischer Browser-Sprache auf
www.domain.com/zh/zielseite
springen würde...


Genau dafür ist das Skript ja da!


Beispiel: http://www.conject.com mit de, en und ru

ProfilWWW
Verfasst am: 03. 09. 2008 [14:32]
bruder_chang
Dabei seit: 06.06.2006
Beiträge: 36
Vielen Dank für die schnelle Antwort!

Leider funktioniert das noch nicht so recht.
Wenn ich aus "www.domain.com/en/contact" "www.domain.com/contact" mache, lande ich auf der englischsprachigen Startseite (Englisch ist Standardsprache).
Dabei ist im Firefox Chinesisch als bevorzugte Sprache ausgewählt.
Zeile 6 habe ich entsprechend angepasst und vorsichtshalber auch die Extension rlmp_language_detection deinstalliert.
Leider bringt das nichts.
Ich habe auch das TS nach evtl. Stolpersteinen durchsucht, doch bis auf realurl gibt's da eigentlich nichts, was dazwischenfunken könnte.
Oder ich habe Tomaten auf den Augen.

Typo3 4.1.7
realurl 1.4.0

Vielen Dank,
Bruder Chang

[Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 03.09.2008 um 15:06.]

"Herr Kommissar, Ihre Waffe, bitte." - "Ich brauche keine Waffe. Ich ermittle AUSSCHLIEßLICH mit dem Gehirn!"
Profil
Verfasst am: 03. 12. 2008 [08:50]
kpk
Dabei seit: 03.12.2008
Beiträge: 1
einpraegsam.net schrieb:

...
Abschließendes:
- Vielleicht gibt es schon eine Extension die das alles kann, ich habe keine auf die Schnelle entdecken können.
...


Seht Euch mal die Extention 'jb_status_code' an.
Eine kurze Anleitung dazu findet Ihr unter www.wissenswertes.at/index.php?id=typo3-301

Gruß
Karl-Peter
Profil