Lepší 301 / 404 přesměrování pro BLOG:CMS / F-ART:CMS

MyEgo.cz

home foto blogy mywindows.cz kontakt

Lepší 301 / 404 přesměrování pro BLOG:CMS / F-ART:CMS

Pokud používáte BLOG:CMS 4.x či F-ART:CMS 5.x, tak si můžete zlepšit chování systému při nenalezení URL, popřípadě při nalezení starého URL (URL je tvořeno z názvu článku, takže při jeho změně se staré URL přes 301 Permanent Redict přesměruje na nové URL a neduplikuje se obsah, což vyhledávače penalizují).

V knihovně globalfunctions.php si najděte funkci setGlobalVariables() a sekci itemid upravte následovně:

    /* item id */
    if ($data[$i]=='itemid' || $data[$i]=='item' || ($type=='item' && $i==0) ){
      if (is_numeric($data[$i+1]))
        $itemid=intval($data[$i]);
      else {
      	if (strpos($data[$i+1],'?') !== false)
      		$data[$i+1] = substr($data[$i+1],0,strpos($data[$i+1],'?'));
      	$query  = sql_query("SELECT iblog, inumber FROM ".sql_table('item')." WHERE iurltitle='".sql_escape(unicode_decode($data[$i+1]))."'");
      	if ($row = sql_fetch_object($query)) { // regular item URL
      	  $blogid = $row->iblog;
      	  $itemid = $row->inumber;
      	} else {
      	  $query=sql_query("SELECT inumber FROM ".sql_table('plugin_fancierurl')." WHERE iurltitle='".sql_escape(unicode_decode($data[$i+1]))."'");
      	  if ($row = sql_fetch_object($query)) { 
        	  	$itemid = $row->inumber;
        	  	$exists = quickQuery('SELECT count(*) as result FROM '.sql_table('item').' WHERE inumber='.$itemid);
        	  	if ($exists) { // article has a newer URL, so redirect
					header('HTTP/1.1 301 Moved Permanently'); 
					header('Location: '.fancyLink($itemid)); 
					exit(0);
        	  	}
          } 
          // item probably deleted or wrong URL
       	  header('HTTP/1.0 404 Not Found');
          global $DIR_ROOT;
          if (is_file($DIR_ROOT.'error.html'))
          	echo file_get_contents($DIR_ROOT.'error.html');
          else
          	printNiceMessage('HTTP/1.0 404 Not Found','Článek s URL <code>'.unicode_decode($data[$i+1]).'</code> nebyl nenalezen. Váš odkaz je pravděpodobně zastaralý. Použijte prosím funkci <strong>hledání</strong>.');
          exit(0);
        }
      }
      if ($itemid) $i++;
    }

Rovněž bych doporučoval na 404 stránku (nalézající se v rootu webu s názvem error.html) doplnit Google Custom Search, popřípadě hledání redakčního systému, jako je tomu zde.

Mimochodem tuto 404 můžete (po patřičných obměnách URL) použít volně v libovolném vašem projektu.


Komentáře

  1. 1 Michal Krajcirovic 04.07.08, 10:07:09
    FB

    velice pěkně zpracovaná 404ka, děkuji a rád použiji.

  2. 2 Eduard Veleba 05.07.08, 12:07:05
    FB

    Jen se zeptám, proč tam máte jednou HTTP/1.1 a jednou HTTP/1.0? Nemělo by to být podle toho, jaký protokol použije klient v requestu?

  3. 3 Radek Hulán 05.07.08, 08:07:29
    FB

    [2] je to úplně jedno. Všichni klienti dnes podporují HTTP/1.0 i 1.1