Dienstag, 24. Januar 2012

joomla 1.7.3 multilanguage 303 redirect problem

Für meinen Kunden www.mixwerk.com habe ich kürzlich eine mehrsprachige Seite online gestellt.
Zum Einsatz, für die Übersetzung kam dabei Falang, da mir dass Joomla eigene Übersetzungssystem zu umständlich erscheint und sowieso Joomfish Kenntnisse vorhanden waren.

Problem war allerdings, dass es auf der Startseite www.mixwerk.com zu einem 303 redirect kam.

hecked link: http://www.mixwerk.com

Type of redirect: 303 See other
Redirected to: http://www.mixwerk.com/de/

Da dies bspw. dazu führt, dass der dynamische Sitemap Link von xmap nicht gefunden werden kann und vermutlich auch sonst eher negative auswirkungen aufs Google Ranking zu befürchten sind, poste ich hier mal den corehack der das Problem löst.

Update siehe Ende des Beitrages!

plugins/system/languagefilter/languagefilter.php
Zeile 195 -248 Joomla 1.7.3
    // Redirect only if not in post
   $post = JRequest::get('POST');
   if (JRequest::getMethod() != "POST" || count($post) == 0)
   {
    if ($this->params->get('remove_default_prefix', 0) == 0)
    {
     // redirect if sef does not exists
     if (!isset(self::$sefs[$sef]))
     {
      // Use the current language sef or the default one
      $sef = isset(self::$lang_codes[$lang_code]) ? self::$lang_codes[$lang_code]->sef : self::$default_sef;
      $uri->setPath($sef . '/' . $path);

      if ($app->getCfg('sef_rewrite')) {
       // $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')));
      }
      else {
       $path = $uri->toString(array('path', 'query', 'fragment'));
       // $app->redirect($uri->base().'index.php'.($path ? ('/' . $path) : ''));
      }
     }
    }
    else
    {
     // redirect if sef does not exists and language is not the default one 
     if (!isset(self::$sefs[$sef]) && $lang_code != self::$default_lang)
     {
      $sef = isset(self::$lang_codes[$lang_code]) ? self::$lang_codes[$lang_code]->sef : self::$default_sef;
      $uri->setPath($sef . '/' . $path);

      if ($app->getCfg('sef_rewrite')) {
       // $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')));
      }
      else {
       $path = $uri->toString(array('path', 'query', 'fragment'));
       // $app->redirect($uri->base().'index.php'.($path ? ('/' . $path) : ''));
      }
     }
     // redirect if sef is the default one
     elseif ($sef == self::$default_sef)
     {
      array_shift($parts);
      $uri->setPath(implode('/' , $parts));

      if ($app->getCfg('sef_rewrite')) {
        $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')));
      }
      else {
       $path = $uri->toString(array('path', 'query', 'fragment'));
       // $app->redirect($uri->base().'index.php'.($path ? ('/' . $path) : ''));
      }
     }
    }
   }

Ohne Gewähr, vorher Update der Datei erstellen.

Update:
Von Torsten kommt folgende E-mail Nachricht zur Verbesserung des Hacks, da es eine neue Falang Version gibt.
Mittlerweile kann man dem Redirect sagen ob er 301 oder 303 ist. Dieser Fix sollte also aktualisiert werden.Die Datei    \libraries\joomla\application\application.php enthält die Methodeenthält die Methode    public function redirect($url, $msg = '', $msgType = 'message', $moved = false)
Somit kann in der Datei    /plugins/system/languagefilter/languagefilter.php
der Code entsprechend angepasst werden.
Statt :  // $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')));schreibt man dann :  $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')), null, 'message', true);
Bedeutung der Werte:  true = 301 false = 303
Dies würden Vorteil bieten die Redirects von FaLang fall-spezifisch als 303 oder 301 auszuführen.
Danke für die Info! 

Keine Kommentare: