Seite 1 von 1

Länderauswahl Meta-Refresh umgehen

Verfasst: 19.12.2012, 10:21
von Chh1
Folgender Code ist aktuell auf der index.php (der Übersichtlichkeit halber gekürzt).

Code: Alles auswählen

<?PHP
//Automatische Sprachauswahl
if &#40;$_GET&#91;"site"&#93;==''&#41;&#123;

if&#40;$sprachauswahl=="de"&#41; &#123;  ?>
<meta http-equiv="refresh" content="0; URL=home.html">
<?PHP 
&#125;  
else if&#40;&#40;$sprachauswahl=="de-de"&#41;||&#40;$sprachauswahl=="de-DE"&#41;&#41; &#123;  ?>
<meta http-equiv="refresh" content="0; URL=home.html" />
<?PHP 
&#125;  
else if&#40;&#40;$sprachauswahl=="de-at"&#41;||&#40;$sprachauswahl=="de-AT"&#41;&#41; &#123;  ?>
<meta http-equiv="refresh" content="0; URL=home.html" />
<?PHP
&#125; 
else if&#40;$sprachauswahl=="fr"&#41; &#123;  ?>
<meta http-equiv="refresh" content="0; URL=fr_home.html" />
<?PHP
&#125; 

.
.
.

else&#123; ?>
<meta http-equiv="refresh" content="0; URL=en_home.html" />
<?PHP
&#125; &#125;
?>
Ich möchte die Meta-Refresh durch 301 ersetzen.

Funktioniert das so:

Code: Alles auswählen

<?PHP
//Automatische Sprachauswahl
if &#40;$_GET&#91;"site"&#93;==''&#41;&#123;

if&#40;$sprachauswahl=="de"&#41; &#123;  
header&#40;"HTTP/1.1 301 Moved Permanently"&#41;; 
header&#40;"Location&#58; http&#58;//www.domain.de/home.html"&#41;; 
&#125;  
else if&#40;&#40;$sprachauswahl=="de-de"&#41;||&#40;$sprachauswahl=="de-DE"&#41;&#41; &#123; 
header&#40;"HTTP/1.1 301 Moved Permanently"&#41;; 
header&#40;"Location&#58; http&#58;//www.domain.de/home.html"&#41;; 
&#125;  
else if&#40;$sprachauswahl=="fr"&#41; &#123;  
header&#40;"HTTP/1.1 301 Moved Permanently"&#41;; 
header&#40;"Location&#58; http&#58;//www.domain.de/fr_home.html"&#41;; 
&#125; 
.
.
.
else&#123; 
header&#40;"HTTP/1.1 301 Moved Permanently"&#41;; 
header&#40;"Location&#58; http&#58;//www.domain.de/en_home.html"&#41;; 
&#125; &#125;
?>
Oder wie würdet ihr das machen?

Habe irgendwie Bedenken ein 301 in eine if zu packen. Checkt das die Suchmaschine?

Verfasst:
von

Verfasst: 19.12.2012, 14:20
von Melegrian
In welchem Parameter ist denn die $sprachauswahl gespeichert? Die muss doch irgendwoher kommen?
Mir tut immer die Sicherheit etwas weh. Kenne zwar längst nicht alle Möglichkeiten für Angriffe, doch ein wenig filtern kann ja nie verkehrt sein.

Variante 1:

Code: Alles auswählen

if &#40;isset&#40;$_GET&#91;"sprachauswahl"&#93;&#41;&#41; and !empty&#40;$_GET&#91;"sprachauswahl"&#93;&#41;&#41; &#123;

	$sprachauswahl = $_GET&#91;"sprachauswahl"&#93;;
	$sprachauswahl = strtolower&#40;$sprachauswahl&#41;;
	$sprachauswahl = preg_replace&#40;"/&#91;a-z-&#93;/", "", $sprachauswahl&#41;;

	if&#40;$sprachauswahl == "de"&#41; &#123; 
	header&#40;"HTTP/1.1 301 Moved Permanently"&#41;;
	header&#40;"Location&#58; http&#58;//www.domain.de/home.html"&#41;;
	&#125; 
	/* ||&#40;$sprachauswahl=="de-DE"&#41; entfällt, da alles in Kleinbuchstaben umgewandelt wurde */
	elseif&#40;$sprachauswahl == "de-de"&#41; &#123;          
	header&#40;"HTTP/1.1 301 Moved Permanently"&#41;;
	header&#40;"Location&#58; http&#58;//www.domain.de/home.html"&#41;;
	&#125; 
	elseif&#40;$sprachauswahl == "fr"&#41; &#123; 
	header&#40;"HTTP/1.1 301 Moved Permanently"&#41;;
	header&#40;"Location&#58; http&#58;//www.domain.de/fr_home.html"&#41;;
	&#125;
	.
	.
	.
	else&#123;
	header&#40;"HTTP/1.1 301 Moved Permanently"&#41;;
	header&#40;"Location&#58; http&#58;//www.domain.de/en_home.html"&#41;;
   &#125; 
&#125; 
Sind bei einer Sprache mehr als zwei Buchstaben erforderlich?
Falls nicht, dann kürzen.

Variante 2:

Code: Alles auswählen

if &#40;isset&#40;$_GET&#91;"sprachauswahl"&#93;&#41;&#41; and !empty&#40;$_GET&#91;"sprachauswahl"&#93;&#41;&#41; &#123;

	$sprachauswahl = $_GET&#91;"sprachauswahl"&#93;;
	$sprachauswahl = strtolower&#40;$sprachauswahl&#41;;
	$sprachauswahl = preg_replace&#40;"/&#91;a-z-&#93;/", "", $sprachauswahl&#41;;
	$sprachauswahl = substr&#40;$sprachauswahl, 0, 2&#41;;	

	if&#40;$sprachauswahl == "de"&#41; &#123; 
	header&#40;"HTTP/1.1 301 Moved Permanently"&#41;;
	header&#40;"Location&#58; http&#58;//www.domain.de/home.html"&#41;;
	&#125;  
	else&#123;
	header&#40;"HTTP/1.1 301 Moved Permanently"&#41;;
	header&#40;"Location&#58; http&#58;//www.domain.de/".$sprachauswahl."_home.html"&#41;;
   &#125; 
&#125;

Verfasst: 09.01.2013, 14:10
von Chh1
Meine Frage zielte eher darauf ab, ob allgemein hier 301 die richtige Methode ist, oder ob ihr so etwas anders lösen würdet.

Verfasst:
von

Verfasst: 09.01.2013, 22:29
von Melegrian
Kommt ja darauf an zwischen wie vielen Sprachen Du wechseln möchtest. Bei zwei Sprachen genügt bereits die jeweils andere Sprache innerhalb des Form-Tags als Zielseite beim Attribut action anzugeben. Bei drei Sprachen könntest Du Länderflaggen mit einem direkten Link nehmen. Bei wesentlich mehr Sprachen kommt dann eine Weiterleitung ins Spiel.

Ob 301 oder 302 sollte eigentlich weniger eine Rolle spielen, die Weiterleitung ist ja für den User und nicht für den Bot. Ein Bot wird wohl nicht das Formular wiederholt mit allen Auswahlmöglichkeiten absenden, um zu sehen, was bei jeder Option passiert und für den User ist nur der Wechsel entscheidend.

Es sei denn, Du möchtest kein Formular für die Auswahl benutzen, doch da eine Übergabe per GET erfolgt, nehme ich nur mal an, das ein Formular benutzt wird. Hatte ja gefragt, in welchem Parameter die $sprachauswahl gespeichert wird und woher die kommt.

Verfasst: 22.01.2013, 10:33
von Chh1
Sorry, stand auf dem Schlauch. Der aktuelle Code ist nicht von mir, außerdem ist mir eine automatische Sprachauswahl bis jetzt nicht untergekommen.

Es wird kein Formular benutzt. Die Sprache wird automatisch (wohl aus dem Browser) ausgelesen.
Sieht folgendermaßen aus:

$sprache = @getenv('HTTP_ACCEPT_LANGUAGE');
$sprachauswahl = substr($sprache, 0, 5);

Das heißt also, dass je nachdem mit welcher Sprache man kommt eine andere Version der Seite angezeigt bekommt. So soll das auch sein, aber wie reagiert darauf der Googlebot?
Und das ist auch das, was mich vorsichtig macht und worauf meine Frage abzielt.
Ist das nicht eine Art Cloaking?

Verfasst: 23.01.2013, 08:34
von Melegrian
Da bin ich augenblicklich überfragt, nicht das der Bot mal weitergeleitet wird und mal nicht. Ein Browser wird ja auf eine bevorzugte Sprache eingestellt und wenn sich Browser und Server unterhalten, so wird im HTTP-Header Accept-Language ausgetauscht.

https://www.w3.org/International/questi ... les.de.php

Aber wie ist das nun bei einer Anfrage von einem Bot?
Was wird da ausgetauscht?
Ein Bot wird doch wohl neutral kommen?

Um völlig sicher zu sein, so sollte eine Auswahl nur erfolgen, wenn die Anfrage von einem Browser kommt. Somit müsste wohl zuerst der User Agent abgefragt werden, ob es sich um einen bekannten Browser handelt?

Verfasst: 23.01.2013, 09:07
von Chh1
Vielen Dank für deine Antworten Melegrian. Ich glaube du hast verstanden was ich meine.

Melegrian hat geschrieben: Um völlig sicher zu sein, so sollte eine Auswahl nur erfolgen, wenn die Anfrage von einem Browser kommt. Somit müsste wohl zuerst der User Agent abgefragt werden, ob es sich um einen bekannten Browser handelt?
Kann ich dann auch nicht gleich den meta-refresh lassen und verzichte lieber ganz auf 301?
Kann mir da vielleicht noch jemand anderes helfen?

Verfasst: 23.01.2013, 18:43
von Melegrian
Problem bei der Beantwortung, in den Logs sehe ich nur IP, Datum/Uhrzeit, Methode, besuchte Seite, Protokoll, Statuscode, User Agent und Referrer. Ich sehe aber nicht, was der komplette HTTP-Header enthalten hat. Wenn Du das erfahren möchtest, so müsstest Du die HTTP-Header tracken, doch das werden wohl nur wenige machen. Aber nur dann wäre die Frage richtig zu beantworten. Einige im Forum hier sollten sich damit jedoch auskennen.