Mittwald CM Service: TYPO3-Hosting, TYPO3-Schulungen, Agenturpakete, Managed-Server
Optimiertes TYPO3 Hosting von Mittwald CM Service

[HowTo] 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: 8105

über 5000 Posts
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:Zeilennummerierung:  An / Aus

  1. includeLibs.user_301redirect = fileadmin/user_301redirect.php
  2.  
  3. page.1 = USER_INT
  4. page.1.userFunc = user_301redirect->user_main



- Anlegen der entsprechenden Datei (z.B.) fileadmin/user_301redirect.php:
Php:Zeilennummerierung:  An / Aus

  1. <?php
  2.  
  3.         class user_301redirect {
  4.        
  5.                 var $correctDomain = 'www.domain.com'; // default domain
  6.                 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!)
  7.                 var $languageForRobots = 'de'; // language for visiting robot
  8.                 var $index2html = 1; // domain.de/page/index.html => domain.de/page.html redirect
  9.                 var $debugmode = 0; // enable or disable debugmode (redirect or only print of the new url)
  10.                
  11.                 // Main function for 301 redirect of old or wrong URIs
  12.                 function user_main($content='', $conf=array()) {
  13.                         // config
  14.                         $newurl = '';
  15.                         if (strpos($_SERVER['REQUEST_URI'], 'index.php') === false) { // only if no manual domain like www.conject.com/index.php?id=3
  16.                                
  17.                                 // Let's go
  18.                                 if ($_GET['L'] == '' || $_SERVER['SERVER_NAME'] != $this->correctDomain || strpos($_SERVER['REQUEST_URI'], '/index.html') !== false) { // if wrong url OR no language variable set
  19.                                        
  20.                                         if ($_GET['L'] == '') { // no language variable set, so add one
  21.                                                
  22.                                                 $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
  23.                                                
  24.                                         } else { // language variable set, so redirect only to www.conject.com
  25.                                                
  26.                                                 $newurl = 'http://' . $this->correctDomain . $_SERVER['REQUEST_URI']; // add correct domain (without language variable
  27.                                        
  28.                                         }
  29.                                        
  30.                                         if (strpos($newurl, '/index.html') !== false && $this->index2html) { // if there is an /index.html within the url AND redirect active
  31.                                                 $newurl = str_replace('/index', '', $newurl); // replace /index with nothing
  32.                                         }
  33.                                        
  34.                                 }
  35.                                
  36.                                 if (!empty($newurl)) { // only if set
  37.                                         if ($this->debugmode != 1) { // if no debugmode
  38.                                                 // redirect to new domain via 301
  39.                                                 header('HTTP/1.1 301 Moved Permanently');
  40.                                                 header('Location: '.$newurl);
  41.                                                 header('Connection: close');
  42.                                         } else { // if debugmode active
  43.                                                 echo $newurl; // only show url
  44.                                         }
  45.                                 }
  46.                                
  47.                         }
  48.                        
  49.                         return false; // always return nothing
  50.                        
  51.                 }
  52.                
  53.                
  54.                 // Function lang_getfrombrowser() gets the language variable
  55.                 function lang_getfrombrowser ($allowed_languages, $default_language, $lang_variable = null, $strict_mode = true, $lang_robot = 'de') {
  56.                        
  57.                         if ($this->checkRobot() == false) { // no robot is visiting
  58.                        
  59.                                 // use $_SERVER['HTTP_ACCEPT_LANGUAGE'] if no lang variable
  60.                                 if ($lang_variable === null) {
  61.                                         $lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
  62.                                 }
  63.                                
  64.                                 // are there any information
  65.                                 if (empty($lang_variable)) {
  66.                                         // NO? => use default lang
  67.                                         return $default_language;
  68.                                 }
  69.                                        
  70.                                 // Split header
  71.                                 $accepted_languages = preg_split('/,\s*/', $lang_variable);
  72.                                
  73.                                 // Default values
  74.                                 $current_lang = $default_language;
  75.                                 $current_q = 0;
  76.                                
  77.                                 // One loop for every lang
  78.                                 foreach ($accepted_languages as $accepted_language) {
  79.                                         // Get all infos about lang
  80.                                         $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);
  81.                                        
  82.                                         // Sytax correct
  83.                                         if (!$res) {
  84.                                                 // No - so ignore
  85.                                                 continue;
  86.                                         }
  87.                                        
  88.                                         // Sprachcode holen und dann sofort in die Einzelteile trennen
  89.                                         $lang_code = explode ('-', $matches[1]);
  90.                                
  91.                                         // Wurde eine Qualität mitgegeben?
  92.                                         if (isset($matches[2])) {
  93.                                                 // die Qualität benutzen
  94.                                                 $lang_quality = (float)$matches[2];
  95.                                         } else {
  96.                                                 // Kompabilitätsmodus: Qualität 1 annehmen
  97.                                                 $lang_quality = 1.0;
  98.                                         }
  99.                                
  100.                                         // Bis der Sprachcode leer ist...
  101.                                         while (count ($lang_code)) {
  102.                                                 // mal sehen, ob der Sprachcode angeboten wird
  103.                                                 if (in_array (strtolower (join ('-', $lang_code)), $allowed_languages)) {
  104.                                                         // Check quality
  105.                                                         if ($lang_quality > $current_q) {
  106.                                                                 // use this lang
  107.                                                                 $current_lang = strtolower (join ('-', $lang_code));
  108.                                                                 $current_q = $lang_quality;
  109.                                                                 // Stop while loop
  110.                                                                 break;
  111.                                                         }
  112.                                                 }
  113.                                                
  114.                                                 // Don't minimalize language if in strict mode
  115.                                                 if ($strict_mode) {
  116.                                                         // stop while loop
  117.                                                         break;
  118.                                                 }
  119.                                                
  120.                                                 // deactivate right part of the language code
  121.                                                 array_pop ($lang_code);
  122.                                         }
  123.                                 }
  124.                                
  125.                         } else { // if robot is visiting
  126.                                 $current_lang = $lang_robot; // robot language
  127.                         }
  128.                
  129.                         return $current_lang;
  130.                 }
  131.                
  132.                 // Function checkRobot() checks if visiter is a robot
  133.                 function checkRobot() {
  134.                         $trackUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
  135.                        
  136.                         if (stristr($trackUserAgent ,"archiver")) $trackrobot = "Alexa";
  137.                         if (stristr($trackUserAgent ,"exabot")) $trackrobot = "Exalead";
  138.                         if (stristr($trackUserAgent ,"fast")) $trackrobot = "Fast";
  139.                         if (stristr($trackUserAgent ,"firefly")) $trackrobot = "Fireball";
  140.                         if (stristr($trackUserAgent ,"googlebot")) $trackrobot = "Google";
  141.                         if (stristr($trackUserAgent ,"msnbot")) $trackrobot = "MSN";
  142.                         if (stristr($trackUserAgent ,"architextspider")) $trackrobot = "Excite";
  143.                         if (stristr($trackUserAgent ,"scooter")) $trackrobot = "Altavista";
  144.                         if (stristr($trackUserAgent ,"lycos_spider")) $trackrobot = "Lycos";
  145.                         if (stristr($trackUserAgent ,"slurp")) $trackrobot = "Yahoo";
  146.                        
  147.                         /* Own entries */
  148.                         if (stristr($trackUserAgent ,"nagios")) $trackrobot = "Nagios";
  149.                         if (stristr($trackUserAgent ,"robot")) $trackrobot = "Robot";
  150.                         if (stristr($trackUserAgent ,"crawl")) $trackrobot = "Crawler";
  151.                         if (stristr($trackUserAgent ,"gigabot")) $trackrobot = "GigaBot";
  152.                         if (stristr($trackUserAgent ,"echo!")) $trackrobot = "EchO!";
  153.                         if (stristr($trackUserAgent ,"baiduspider")) $trackrobot = "BaiDuSpider";
  154.                         if (stristr($trackUserAgent ,"askjeeves")) $trackrobot = "AskJeeves";
  155.                         if (stristr($trackUserAgent ,"turnitin")) $trackrobot = "Turn It In";
  156.                         if (stristr($trackUserAgent ,"speedyspider")) $trackrobot = "Speedy Spider";
  157.                         if (stristr($trackUserAgent ,"bot/")) $trackrobot = "Bot";
  158.                         if (stristr($trackUserAgent ,"bot-")) $trackrobot = "Bot";
  159.                         if (stristr($trackUserAgent ,"psbot")) $trackrobot = "PS Bot";
  160.                         if (stristr($trackUserAgent ,"thepythonrobot")) $trackrobot = "The Python Robot";
  161.                         if (stristr($trackUserAgent ,"voila")) $trackrobot = "Voila";
  162.                         if (stristr($trackUserAgent ,"bspider")) $trackrobot = "BSpider";
  163.                         if (stristr($trackUserAgent ,"surveybot")) $trackrobot = "SurveyBot";
  164.                         if (stristr($trackUserAgent ,"grub.org")) $trackrobot = "Grub.org";
  165.                         if (stristr($trackUserAgent ,"alexa")) $trackrobot = "Alexa";
  166.                         if (stristr($trackUserAgent ,"arks")) $trackrobot = "Arks";
  167.                         if (stristr($trackUserAgent ,"spider")) $trackrobot = "Spider";
  168.                         if (stristr($trackUserAgent ,"yandex")) $trackrobot = "Yandex bot";
  169.                         if (stristr($trackUserAgent ,"holmes")) $trackrobot = "Holmes";
  170.                         /* Own entries end */
  171.                        
  172.                         if ($trackrobot != "") {
  173.                                 return $trackrobot;
  174.                         } else {
  175.                                 return FALSE;
  176.                         }
  177.                 }
  178.                
  179.         }
  180.  
  181. ?>




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

Powermail :: einpraegsam.net :: Follow Me :: XING profile :: conject
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!"
Verfasst am: 03.09.2008 [14:08]
einpraegsam.net

[Moderator]
[Themenersteller]
dabei seit: 17.01.2005
Beiträge: 8105

über 5000 Posts
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:Zeilennummerierung:  An / Aus

  1. var $languages = array('en','cn',3 => 'jp');
  2. 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

Powermail :: einpraegsam.net :: Follow Me :: XING profile :: conject
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 1 mal 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!"
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




 
TYPO3 Hosting in der Version 4.3.2 kostenlos bei Mittwald CM Service testen

TYPO3 4.3.2 jetzt testen

Testen Sie die neue TYPO3 Version 4.3.2 kostenlos für einen Monat


Entwicklerschulungen

  • Espelkamp:
    Mit., 17.03.10 - Fre., 19.03.10
  • Berlin:
    Mit., 21.04.10 - Fre., 23.04.10
  • Köln:
    Mon., 21.06.10 - Mit., 23.06.10