Peter Kaufmann: RewriteRule für Verzeichnis

Hallo alle,

nach langer Abstinenz melde ich mich noch einmal mit einem Problem zu rewrite rules. Um das Problem an für sich zu erklären hohle ich mal etwas aus.

Ich möchte eine zweisprachige Webseite bauen und benutze für die Sprachwahl das Apache Modul MultiViews. Für die User, die eine falsche Spracheinstellung haben (was meiner Erfahrung nach relativ viele sind), möchte ich auf jede Seite einen Link zu der anderen Sprachversion setzen. Damit die Sprache aber nur einmal manuell gewählt werden muss, möchte ich aber nicht z.B. einfach auf "seite.html.en" verweisen sondern auf "en/seite.html" und das Postfix ".en" per RewriteRule ergänzen (das hat den Vorteil, daß der User bei relativen Links in der englischen Version bleibt auch wenn er DE als Sprache im Browser gewählt hat). Soweit klappt das auch ganz gut.

Ein Problem habe ich aber in dem Moment wenn es um ein Verzeichnis geht, etwa "example.org/en/mitarbeiter". Um in meinem Muster zu bleiben müsste ich ein rewrite auf "example.org/mitarbeiter/index.html.en" machen (index.html ist mein default DirectoryIndex). Leider komme ich nicht darauf wie die RewriteRule für diesen Fall aussehen muss. Hat jemand eine Idee?

Bisher habe ich:

.htaccess in example.org/tmp/test

Options +MultiViews
RewriteEngine on

RewriteBase   /tmp/test
RewriteRule de/(.+[^/]) $1.de [L]
RewriteRule en/(.+[^/]) $1.en [L]

Grüße,

Peter

--
exp(i * PI) + 1 = 0
  1. Hallo

    [...]

    Du möchtest etwas machen, was jemand wie http://www.woodshed.de/ schon gemacht hat.

    Leider komme ich nicht darauf wie die RewriteRule für diesen Fall aussehen muss. Hat jemand eine Idee?

    Es gibt keine Rewrite-Rules, die das leisten.

    Angenommen

    www.example.com/irgendwas.html würde immer umgeleitet werden auf www.example.com/en/irgendwas.html, dann würde *jeder* besucher nur die englische Version sehen. Wenn er dann *deutsch* anklickt, dann müsstest  du das in seinem PC speichern (cookie) denn ein Redirekt würde ihn ja wieder auf die englische Seite bringen.

    Mache es so wie in der Beispielseite und mache es ohne Cookie.

    Herzliche Grüße
    Wolfgang

    1. Hallo Wolfgang,

      erst einmal vielen Dank für deine Antwort. Ich befürchte aber, du hast mein Problem nicht ganz verstanden (habe ich viellicht auch nicht gut genug erklärt).

      Du möchtest etwas machen, was jemand wie http://www.woodshed.de/ schon gemacht hat.

      Nein. Wenn ich mit einem Browser der englisch als Default Sprache eingestellt hat auf die Seite gehe bekomme ich trotzdem ein fröhliches "Guten Tag!".

      Leider komme ich nicht darauf wie die RewriteRule für diesen Fall aussehen muss. Hat jemand eine Idee?

      Es gibt keine Rewrite-Rules, die das leisten.

      Angenommen

      www.example.com/irgendwas.html würde immer umgeleitet werden auf www.example.com/en/irgendwas.html, dann würde *jeder* besucher nur die englische Version sehen. Wenn er dann *deutsch* anklickt, dann müsstest  du das in seinem PC speichern (cookie) denn ein Redirekt würde ihn ja wieder auf die englische Seite bringen.

      Nein, so ist das nicht geplannt. Also noch einmal etwas strukturierter:

      1. Wenn die Spracheinstellung im Browser richtig ist (z.B. english), und der Besucher die Seite www.example.org/bla.html verlangt, sorgt das Modul MultiViews dafür, daß er als Antwort eine passende Sprachversion erhält (z.B. www.example.org/bla.html.en). - Das funktioniert auch problemlos.

      2. Schwierig wird es, wenn die Spracheinstellung des Browsers falsch ist - etwa im Internetcaffee. In diesem Fall rät das Modul MultiViews falsch und mein englischer Besucher bekommt z.B. auf seine Anfrage www.example.org/bla.html eine deutsche Seite zurückgeliefert www.example.org/bla.html.de. Für diesen Fall soll es ein Link "english version" von www.example.org/bla.html.de nach www.example.org/bla.html.en geben. Das Problem ist dann aber, daß beim nächsten Aufruf (foo.html) er wieder auf der falschen Seite landet (www.example.org/foo.html.de).

      3. Um das Problem aus (2) zu umgehen möchte ich nicht auf www.example.org/bla.html.en verweisen sondern auf www.example.org/en/bla.html - eine passende RewriteRule (RewriteRule en/(.+[^/]) $1.en [L]) sorgt dann dafür, daß der Besucher letzt endlich trotzdem die Seite www.example.org/bla.html.en zurück geliefert bekommt. Der Vorteil ist, daß jetzt ein relativer Link von bla.html nach foo.html zu
       der URI www.example.org/en/foo.html (also die Datei foo.html.en) führt. Soweit funktioniert das auch ganz gut.

      4. Das Problem ist, daß ich nicht weiß wie eine RewriteRule aussehen muss die z.B. ein rewrite von www.example.org/en/foo/ nach www.example.org/foo/index.html.en ausführt (also den speziellen Fall schon, aber den allgemeinen Fall nicht). Solch eine Regel sollte nach Möglichkeit auch die Fälle www.example.org/en/foo/bar/bla/ (mehre Verzeichnisebenen) und www.example.org/en/foo/bar/bla (ohne Slash am Ende) berücksichtigen. Leider bin ich an dem Punkt noch nicht weiter gekommen :-(. Ideen? Tipps?

      Grüße,

      Peter

      --
      exp(i * PI) + 1 = 0