<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lösung von Typo3 Problemen! &#187; 301 redirects</title>
	<atom:link href="http://www.typo3-problem.com/tag/301-redirects/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.typo3-problem.com</link>
	<description>Typoscript, Typo3 selber oder PHP, hier werden verschiedenste Probleme gelöst!</description>
	<lastBuildDate>Fri, 17 Dec 2010 13:56:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Weiterleitung von ohne www. auf mit www. &#8211; Die PHP-Lösung</title>
		<link>http://www.typo3-problem.com/2009/07/18/weiterleitung-von-ohne-www-auf-mit-www-die-php-losung/</link>
		<comments>http://www.typo3-problem.com/2009/07/18/weiterleitung-von-ohne-www-auf-mit-www-die-php-losung/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 18:31:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[301 redirects]]></category>
		<category><![CDATA[Lösung]]></category>
		<category><![CDATA[Suchmachinen]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[typo3]]></category>

		<guid isPermaLink="false">http://www.typo3-problem.com/?p=20</guid>
		<description><![CDATA[Es gibt bereits viele Möglichkeiten im Web um Duplicate Entry durch das weglassen von www. zu vermeiden. Häufig sind Seiten sowohl mit als auch ohne das www vor der URL zu erreichen, die weiteren Verlinkungen gehen dann zwar meist einheitlich auf eine Methode über, aber trotzdem ist es eine unschöne und Suchmachinen-technisch unsaubere Lösung beides [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt bereits viele Möglichkeiten im Web um Duplicate Entry durch das weglassen von www. zu vermeiden. Häufig sind Seiten sowohl mit als auch ohne das www vor der URL zu erreichen, die weiteren Verlinkungen gehen dann zwar meist einheitlich auf eine Methode über, aber trotzdem ist es eine unschöne und Suchmachinen-technisch unsaubere Lösung beides zuzulassen. Auch für Typo3 gibt es Lösungen für das Problem. Man kann zum Beispiel ein Domain Eintrag auf der obersten Seite der Homepage erstellen und dem Sagen, dass er auf die Domain mit www.-Weiterleiten soll. Soviel zur Theorie, bei mir hat die Lösung nicht gut geklappt und es kam häufig zu redirect loops. Falls man jedoch doch diese Methode wählen sollte, sollte man aufjedenfall <a title="JB Status Code" href="http://typo3.org/extensions/repository/view/jb_status_code/current/" target="_blank">dieses Plugin</a> benutzen, da ein 301 redirect für Suchmachinen in diesem Fall optimal ist.</p>
<p>Nochmal zur Erinnerung, <strong>301 redirects</strong> sagen Google und Co, dass sie die weitergeleitete Seite in Zukunft immer auf der neuen Adresse suchen sollen. Dadurch wird der Page Rank auf die neue Seite vererbt und die Suchmachinen denken nicht, dass zwei mal die selbe Seite mit selben Inhalt existiert, also Duplicate Entry.</p>
<p><strong>Nun also zu meiner Lösung.</strong> Wie bereits in meinem <a title="Benutzer zeigen wo es lang geht" href="http://www.typo3-problem.com/2009/07/17/dem-benutzer-und-den-suchmachinen-zeigen-wo-es-lang-geht/" target="_self">letzten Beitrag</a> benutze ich die Möglichkeit im Typoscript eine PHP-Datei auszuführen. Um von Seiten ohne www auf Seiten mit zu verlinken, überprüfe ich ob die aktuell aufgerufene URL das www am Anfang enthält. Ist dieses nicht vorhanden, mache ich einen 301 redirect auf die selbe Seite, füge jedoch am Anfang das www mit an. Eine wie ich finde absolut einfache Lösung, ohne die htaccess Datei zu bearbeiten oder Extensions installieren zu müssen. Im folgenden der PHP-Quelltext der ausgeführt werden muss um dies zu tun.</p>
<blockquote><p>if (strpos($_SERVER['SCRIPT_URI'],&#8217;www.&#8217;) === FALSE) {<br />
header(&#8216;HTTP/1.1 301 Moved Permanently&#8217;);<br />
header(&#8216;Location: http://&#8217;.$this-&gt;correctDomain.$_SERVER['SCRIPT_URL']); //$this-&gt;correctDomain -&gt; z.B. www.typo3-problem.com<br />
header(&#8216;Connection: close&#8217;);<br />
exit();<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.typo3-problem.com/2009/07/18/weiterleitung-von-ohne-www-auf-mit-www-die-php-losung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dem Benutzer (und den Suchmachinen) zeigen wo es lang geht</title>
		<link>http://www.typo3-problem.com/2009/07/17/dem-benutzer-und-den-suchmachinen-zeigen-wo-es-lang-geht/</link>
		<comments>http://www.typo3-problem.com/2009/07/17/dem-benutzer-und-den-suchmachinen-zeigen-wo-es-lang-geht/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 18:01:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[301 redirects]]></category>
		<category><![CDATA[INT_USER]]></category>
		<category><![CDATA[Lösung]]></category>
		<category><![CDATA[Sprachen]]></category>
		<category><![CDATA[Suchmaninen]]></category>
		<category><![CDATA[Typoscript]]></category>

		<guid isPermaLink="false">http://www.typo3-problem.com/?p=10</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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:</p>
<blockquote><p>// Zunächst die PHP-Datei laden<br />
includeLibs.lang_redirect = fileadmin/libs/lang_redirect.php</p>
<p>// Dann die userFunction ausführen, dies geschieht im PAGE-Objekt<br />
seite.1 = USER_INT<br />
seite.1.userFunc = user_301redirect-&gt;user_main</p></blockquote>
<p>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.</p>
<blockquote><p>class user_301redirect {</p>
<p>var $correctDomain = &#8216;www.domain.com&#8217;; // default domain<br />
var $languages = array(&#8216;en&#8217;,'de&#8217;); // L=0 =&gt; en, L=1 =&gt; de (Attention: the first is default if no defined language could be read!)<br />
var $languageForRobots = &#8216;de&#8217;; // language for visiting robot<br />
var $index2html = 0; // domain.de/page/index.html =&gt; domain.de/page.html redirect<br />
var $debugmode = 0; // enable or disable debugmode (redirect or only print of the new url)</p>
<p>// Main function for 301 redirect of old or wrong URIs<br />
function user_main($content=&#8221;, $conf=array()) {<br />
// config<br />
$newurl = &#8221;;<br />
if (($_SERVER['SCRIPT_URL'] == &#8221; || $_SERVER['SCRIPT_URL'] == &#8216;/&#8217;) &amp;&amp; strpos($_SERVER['HTTP_REFERER'],&#8217;http://&#8217;.$this-&gt;correctDomain) !== 0 &amp;&amp; $this-&gt;checkRobot == &#8221;) { // only if no manual domain like www.conject.com/index.php?id=3</p>
<p>$newurl = $this-&gt;lang_getfrombrowser($this-&gt;languages, $this-&gt;languages[0], null, false, $this-&gt;languageForRobots); // add correct domain (with language variable</p>
<p>if (!empty($newurl)) { // only if set<br />
// redirect to new domain via 301<br />
header(&#8216;HTTP/1.1 302 Found&#8217;);<br />
header(&#8216;Location: http://&#8217;.$this-&gt;correctDomain.&#8217;/&#8217;.$newurl);<br />
header(&#8216;Connection: close&#8217;);<br />
exit();<br />
}</p>
<p>}</p>
<p>return false; // always return nothing</p>
<p>}</p>
<p>// Function lang_getfrombrowser() gets the language variable<br />
function lang_getfrombrowser ($allowed_languages, $default_language, $lang_variable = null, $strict_mode = true, $lang_robot = &#8216;de&#8217;) {</p>
<p>//if ($this-&gt;checkRobot() == false) { // no robot is visiting</p>
<p>// use $_SERVER['HTTP_ACCEPT_LANGUAGE'] if no lang variable<br />
if ($lang_variable === null) {<br />
$lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];<br />
}</p>
<p>// are there any information<br />
if (empty($lang_variable)) {<br />
// NO? =&gt; use default lang<br />
return $default_language;<br />
}</p>
<p>// Split header<br />
$accepted_languages = preg_split(&#8216;/,\s*/&#8217;, $lang_variable);</p>
<p>// Default values<br />
$current_lang = &#8221;;<br />
$current_q = 0;</p>
<p>// One loop for every lang<br />
foreach ($accepted_languages as $accepted_language) {<br />
// Get all infos about lang<br />
$res = preg_match (&#8216;/^([a-z]{1,8}(?:-[a-z]{1,8})*)&#8217;.'(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i&#8217;, $accepted_language, $matches);</p>
<p>// Sytax correct<br />
if (!$res) {<br />
// No &#8211; so ignore<br />
continue;<br />
}</p>
<p>// Sprachcode holen und dann sofort in die Einzelteile trennen<br />
$lang_code = explode (&#8216;-&#8217;, $matches[1]);</p>
<p>// Wurde eine Qualität mitgegeben?<br />
if (isset($matches[2])) {<br />
// die Qualität benutzen<br />
$lang_quality = (float)$matches[2];<br />
} else {<br />
// Kompabilitätsmodus: Qualität 1 annehmen<br />
$lang_quality = 1.0;<br />
}</p>
<p>// Bis der Sprachcode leer ist&#8230;<br />
while (count ($lang_code)) {<br />
// mal sehen, ob der Sprachcode angeboten wird<br />
if (in_array (strtolower (join (&#8216;-&#8217;, $lang_code)), $allowed_languages)) {<br />
// Check quality<br />
if ($lang_quality &gt; $current_q) {<br />
// use this lang<br />
$l = strtolower(join (&#8216;-&#8217;, $lang_code));<br />
if ($l == $default_language)<br />
$current_lang = &#8221;;<br />
else<br />
$current_lang = $l;<br />
$current_q = $lang_quality;<br />
// Stop while loop<br />
break;<br />
}<br />
}</p>
<p>// Don&#8217;t minimalize language if in strict mode<br />
if ($strict_mode) {<br />
// stop while loop<br />
break;<br />
}</p>
<p>// deactivate right part of the language code<br />
array_pop ($lang_code);<br />
}<br />
}</p>
<p>//} else { // if robot is visiting<br />
//        $current_lang = $lang_robot; // robot language<br />
//}</p>
<p>return $current_lang;<br />
}</p>
<p>// Function checkRobot() checks if visiter is a robot<br />
function checkRobot() {<br />
$trackUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']);</p>
<p>if (stristr($trackUserAgent ,&#8221;archiver&#8221;)) $trackrobot = &#8220;Alexa&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;exabot&#8221;)) $trackrobot = &#8220;Exalead&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;fast&#8221;)) $trackrobot = &#8220;Fast&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;firefly&#8221;)) $trackrobot = &#8220;Fireball&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;googlebot&#8221;)) $trackrobot = &#8220;Google&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;msnbot&#8221;)) $trackrobot = &#8220;MSN&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;architextspider&#8221;)) $trackrobot = &#8220;Excite&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;scooter&#8221;)) $trackrobot = &#8220;Altavista&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;lycos_spider&#8221;)) $trackrobot = &#8220;Lycos&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;slurp&#8221;)) $trackrobot = &#8220;Yahoo&#8221;;</p>
<p>/* Own entries */<br />
if (stristr($trackUserAgent ,&#8221;nagios&#8221;)) $trackrobot = &#8220;Nagios&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;robot&#8221;)) $trackrobot = &#8220;Robot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;crawl&#8221;)) $trackrobot = &#8220;Crawler&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;gigabot&#8221;)) $trackrobot = &#8220;GigaBot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;echo!&#8221;)) $trackrobot = &#8220;EchO!&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;baiduspider&#8221;)) $trackrobot = &#8220;BaiDuSpider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;askjeeves&#8221;)) $trackrobot = &#8220;AskJeeves&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;turnitin&#8221;)) $trackrobot = &#8220;Turn It In&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;speedyspider&#8221;)) $trackrobot = &#8220;Speedy Spider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;bot/&#8221;)) $trackrobot = &#8220;Bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;bot-&#8221;)) $trackrobot = &#8220;Bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;psbot&#8221;)) $trackrobot = &#8220;PS Bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;thepythonrobot&#8221;)) $trackrobot = &#8220;The Python Robot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;voila&#8221;)) $trackrobot = &#8220;Voila&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;bspider&#8221;)) $trackrobot = &#8220;BSpider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;surveybot&#8221;)) $trackrobot = &#8220;SurveyBot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;grub.org&#8221;)) $trackrobot = &#8220;Grub.org&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;alexa&#8221;)) $trackrobot = &#8220;Alexa&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;arks&#8221;)) $trackrobot = &#8220;Arks&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;spider&#8221;)) $trackrobot = &#8220;Spider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;yandex&#8221;)) $trackrobot = &#8220;Yandex bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;holmes&#8221;)) $trackrobot = &#8220;Holmes&#8221;;<br />
/* Own entries end */</p>
<p>if ($trackrobot != &#8220;&#8221;) {<br />
return $trackrobot;<br />
} else {<br />
return &#8221;;<br />
}<br />
}</p>
<p>}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.typo3-problem.com/2009/07/17/dem-benutzer-und-den-suchmachinen-zeigen-wo-es-lang-geht/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

