Virtuelles Verzeichnis mit .htaccess

Da ich selbst das halbe Internet auf den Kopf gestellt habe um das herauszufinden, habe ich mir gedacht, das es andere einfacher haben sollen und es demjenigen evt. hilft, wenn er alles gesammelt vorfindet.

Ich musste folgendes Problem lösen:

Es sollte an der URL zwecks Suchmaschinentauglichkeit erkennbar sein, in welcher Sprache der Content der Website verfasst ist.

Beispielsweise so:

Deutsch:
http://example.com/de/home.htm

Englisch:
http://example.com/en/home.htm

Die einfachste Möglichkeit wäre natürlich, die komplette Website in ein Verzeichnis zu packen und dieses „de“ zu benennen und dann das komplette Verzeichnis kopieren, das zu „en“ umbenennen und den enthaltenen Content zu übersetzen. Dies ist aber äußerst undynamisch. Das heißt sobald man in der Programmierung etwas ändert, muss man das immer parallel in 2 Verzeichnissen erledigen. (Sofern man nur 2 Sprachen hat, wenns mehrere sind -> Viel spaß 😉 )

Um die ganze Sache dynamisch zu machen habe ich das mit virtuellen Verzeichnissen gelöst. D.h. dem Browser des Users werden die Verzeichnisse nur vorgegaukelt obwohl diese auf dem Webserver gar nicht existieren. Dies muss der Server aber unterstützen. Die Anforderungen an den Server wären hier für:

  • PHP 5
  • aktiviertes modul „mod_rewrite“ in der PHP Umgebung
  • .htaccess manipulation erlaubt

als erstes habe ich die .htaccess Datei erstellt. Dies geht mit einem einfachen Texteditor. Diese muss folgenden Inhalt enthalten:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)/(.*)\.htm$ index.php?lang=$1&content=$2

Die erste Zeile wird nicht immer benötigt. Manche Server benötigen es, manche nicht. Einfach probieren

dem Befehl „RewriteBase“ muss man sagen, wo sich die die Dateien in Wirklichkeit befinden. In meinem Beispiel befinden sich die Dateien im Root der Domain. Deshalb nur ein „/“

Der Befehl „RewriteRule“ ist der umschreibe Befehl. Dies wird mit Regular Expressions gelöst. Wer sich damit nicht auskennt, sollte nach Regular Expressions googeln. In meinem Beispiel wird
„http://example.com/de/home.htm“
zu
„http://example.com/index.php?lang=de&content=home“

Dies bedeutet, wenn der User in seinen Browser „http://example.com/de/home.htm“ eingibt, wird dies von dem Rewrite Modul des Servers zu „http://example.com/index.php?lang=de&content=home“ umgewandelt. Und genauso wird die Datei dann abgerufen. Also muss die Datei index.php im Root wirklich existieren. Auf diesem Weg kann man dann mittels PHP die $_GET Parameter ganz einfach weiterverarbeiten.

Anstatt dem „de“ und „home“ in „http://example.com/de/home.htm“ kann auch alles mögliche andere Stehen. Dies wird dann auch so weiterverarbeitet.

Nun hab ich mich daran gemacht die index.php so umzubauen, das immer die korrekte Sprache ausgegeben wird. Voraussetzung hierfür ist, das die Website so programmiert ist, das Content und Programmierung voneinander getrennt behandelt werden kann.

Sprachweiche in der index.php:

<?php
/*
wenn content nicht gesetzt bzw. wenn url ohne parameter aufgerufen wird, leite auf
standard seite der standard sprache weiter
*/
if(!isset($_GET['content']))
{

 $link = 'en/home.htm';

 header('Location: '.$link.'');
}
else
{
 //sprache erkennen
 $sprache = $_GET['lang'];

 switch($sprache)
 {
 case 'de': //deutsch
 $_SESSION['language'] = 'de';
 break;

 case 'en': //englisch
 $_SESSION['language'] = 'en';
 break;

 case 'fr': //französisch
 $_SESSION['language'] = 'fr';
 break;

 default: //wenn nichts zutrifft -> englisch
 $_SESSION['language'] = 'en';
 break;
 }

 //übersetzungsdatei laden
 include('cms/lang/language_'.$_SESSION['language'].'.php');
}
?>

Ich speichere die Sprache gerne immer in eine Session, damit die Sprache auch in Funktionen und in Pop-Up Fenstern abfragbar ist.

Sofern die Seite vorher schon bestanden hat, muss man darauf achten, das man alle Links und Grafikverweise untereinander anpassen muss.

Ich hoffe, ich habe mit diesem Artikel helfen können. Falls in diesem Artikel etwas unklar ist, mich bitte mit einem Kommentar darauf hinweisen 🙂

4 Gedanken zu „Virtuelles Verzeichnis mit .htaccess

  1. ChoiZ

    On addict radio i try to know :

    #1 the browser language : $_SERVER[‚HTTP_ACCEPT_LANGUAGE‘]
    #2 if i’ve got in SESSION a language define $_SESSION[‚i18n‘]
    #3 if i’ve got a $_GET[‚i18n‘]

    my variable $i18n is rewrite on case #2 and #3 🙂

    So the high priority it’s $_GET after the $_SESSION and after the browser language 😉

    And in my .htacess it’s like :
    RewriteRule ^([a-z]{0,2})(/?)listen(/?)$ listen.php?i18n=$1
    I test if i’ve got 2 letters between / and / 🙂 and after my page and an optional / 😉

    I think it’s better

    Regards,

  2. Sammy

    thx for your tip 🙂
    the get parameter is also the first and the session in this case is also the second priority.
    but I didn’t use the browser language because it gives the search robots many errors back. do you now an error-free method?

  3. Manuel

    Vielen Dank für die ausführlichen Informationen und Gedankenanstösse! Genau danach hatte ich gesucht. Konnte das ganze super umsetzen, und es hat mir eine Menge Zeit gespart.

Kommentare sind geschlossen.