Modul Rewrite

So genannte ‚dirty links‘ werden so bezeichnet, weil Suchmaschinen damit meist wenig anfangen können und sich z. B. ein Link wie

http://php.nobs-nobody.de/show/home/

einfacher merken lässt als

http://php.nobs-nobody.de/index.php?action=show&page=home

Ein Problem bei vielen Webseiten ist der ‚trailing slash‘ (der slash am Ende der webseite), da Google z. B. unter

http://php.nobs-nobody.de

etwas anderes versteht als unter

http://php.nobs-nobody.de/

Ähnlich verhalten sich Google und Co. bei der Auswertung von Domains mit und ohne ‚www‘.

http://www.php.nobs-nobody.de/

ist nun mal etwas anderes als

http://php.nobs-nobody.de/

Die URI’s in unserem Beispiel so zu vereinfachen, benötigt jedoch ein klein wenig mehr Aufwand, da wir weniger im PHP, als viel mehr in die Server-Konfiguration eingreifen müssen. Das Ganze funktioniert aber nur, wenn unser Webserver ein Modul geladen hat das man
‚ mod_rewrite ‚ nennt. Die folgenden Beispiele konzentrieren sich dabei auf die Konfiguration eines Apache HTTP Servers der moderneren Version (2.x) – eine Anleitung für den IIS folgt später, bis dahin schaue man auf der Technet-Seite nach.

Canonical Page

Der erste Schitt ist sicher zu stellen, dass jede Seite über einen so genannten ‚canonical‘-Tag verfügt. Das erledigt man z. B. im Markup (HTML) mit einem Meta-Tag, der so aussieht:

<link rel="canonical" href="http://php.nobs-nobody.de/" />

Damit sagen wir jedem, der es wissen muss, dass die Inhalte der Seite ohne ‚www‘ und mit ‚trailing slash‘ aufgerufen werden. Jetzt müssen wir im zweiten Schritt nur noch jeden, der diesen ‚trailing slash‘ nicht bzw. das ‚www‘ verwendet, auf die Seite mit ‚trailing slash‘ und ohne ‚www‘ umleiten.
Dazu legen wir uns eine Datei namens ‚ .htaccess ‚ – der Punkt ist sehr wichtig, da er die Datei als versteckt markiert – in unserem Webseiten-Verzeichnis an und öffnen sie mit einem Texteditor.
Die Syntax in einer solchen Datei folgt festen Regeln und ist an die Sprache C angelehnt:

# Abfragestart, ob Modul geladen ist
<ifmodule [modul_datei]>
# Bedingung(en) für eine Überschreibungsregel
RewriteCond [Bedingung]
...
# Überschreibungsregel
RewiteRule [Regel]
# weitere Bedingungen und Regeln
...
# Abfrageende, ob Modul geladen ist
</ifmodule>

Als erstes wird abgefragt, ob ein entsprechendes Modul geladen ist: unser Server braucht ein geladenes Modul ‚mod_rewrite.c‘. Diese Abfrage muss immer in der Form
<ifmodule> … </ifmodule> stehen, da darin die Anweisungen nur für den Fall ausgeführt werden, dass das Modul geladen ist.
Eine oder mehrere Bedingungen werden für eine Regel festgelegt, wobei die Reihenfolge entscheident ist, da die Datei zeilenweise abgearbeitet wird.

Mit oder ohne ‚www‘

Schauen wir uns die wichtigen Zeilen für unser Beispiel mal genauer an:

# HTTP 301 Redirect 1. Variante ########################################
Redirect permanent http://www.php.nobs-nobody.de/ http://php.nobs-nobody.de/
# Modul mod_rewrite.c ##################################################
<ifmodule mod_rewrite.c>
RewriteEngine on
# HTTP 301 Redirect 2. Variante ########################################
  RewriteCond %{HTTP_HOST} !^php.nobs-nobody\.de$
  RewriteRule ^(.*)$ http://php.nobs-nobody.de/$1 [L,R=301]
</ifmodule>

Langsam zu mitdenken:

  • Umleitung 1. Variante: leite Requests an ‚ http://www.php.nobs-nobody.de/ ‚ nach ‚ http://php.nobs-nobody.de/ ‚ um –
    dies leitet aber tatsächlich nur von mit ‚www‘ auf ohne ‚www‘ um, hat aber den Vorteil, das es auch ohne Modul Rewrite funktioniert
  • Führe aus, wenn das Modul mod_rewrite.c gladen ist:
  • Schalte die Rewrite-Engine an
  • Umleitung 2. Variante:
  • Bedingung: wenn der angeforderte Host nicht php.nobs-nobody.de heißt (die .htaccess liegt in UNSEREM verzeichnis, also muss der Host so heißen) –
    %{HTTP_HOST} ist eine Severvariable, in der der vom Client angefragte Server
    (HTTP-Mime-Header-Feld ‚host‘) gespeichert ist,
    das ! bedeutet ’nicht‘,
    das ^ bedeutet ‚beginnt mit‘ und
    das $ bedeutet ‚hier ist Ende‘
  • Regel: dann leite den geforderten URI nach http://php.nobs-nobody.de/$1 um –
    das ^ bedeutet ‚beginnt mit‘,
    das (.*) ist ein Platzhalter,
    das $ bedeutet ‚hier ist Ende‘ und
    das $1 bedeutet der vorherigen Aufruf als Parameter ( ^(.*)$ )

Damit werden im Gegensatz zur ersten Variante so ziemlich alle Anfragen (wie eben auch www.php.nob-nobody.de) auf die „Default Domain“ php.nobs-nobody.de umgeleitet,
da das
[L,R=301]
bedeutet, dass hier erst einmal Schluss mit der Abarbeitung der .htaccess ist (L) und der Client mit einem 301-Status-Code (R=301 wie Redirect mit 301) auf die Adresse ohne ‚www‘ umgeleitet wird.

Trailing Slash


# Modul mod_rewrite.c ##################################################
<ifmodule mod_rewrite.c>
# HTTP 301 Redirect ####################################################
...
# ##### without trailing slash #########################################
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_URI} !(.*)/$
  RewriteRule ^(.*)$ $1/ [L,R=301]
</ifmodule>

Schön schrittweise (ohne die vorherigen Anweisungen):

  • 1. Bedingung: die Datei mit dem geforderten Dateinamen existiert nicht ( !-f ) –
    %{REQUEST_FILENAME} ist eine Severvariable, in der die vom Client angeforderte Datei gespeichert ist,
    das ! bedeutet ’nicht‘ und
    -f ist ein Schalter für ‚Datei existiert‘
  • 2. Bedingung: der URI (Webadresse) endet nicht mit einem Slash –
    %{REQUEST_URI} ist eine Severvariable, in der der vom Client angeforderte URI gespeichert ist,
    das ! bedeutet ’nicht‘,
    und (.*)/$ bedeutet: irgendein URI ( (.*) ) mit einem Slash (/) am Ende ($)

Damit werden alle Anfragen an

http://php.nobs-nobody.de oder http://php.nobs-nobody.de/show/home

nach

http://php.nobs-nobody.de/ oder http://php.nobs-nobody.de/show/home/

umgeleitet.

Schauen wir uns als nächstes die gesäuberten Links an:

Dirty Links


...
# Modul mod_rewrite.c ##################################################
<ifmodule mod_rewrite.c>
RewriteEngine on
# HTTP 301 Redirect ########################################
...
# ##### without trailing slash #################################
...
# ##### with trailing slash ####################################
  RewriteCond %{REQUEST_URI} (.*)/$
  RewriteRule ^(.*)/(.*)/ index.php?action=$1&page=$2
</ifmodule>

Überblicksweise (ohne die vorherigen Anweisungen):

  • Bedingung: wenn der angeforderte URI ( %{REQUEST_URI} ) ein Slash am Ende hat ( (.*)/$ )
  • Regel: dann mache aus dem Ausdruck
    <action>/<page>/ – ^(.*)/(.*)/
    den Ausdruck
    index.php?action=<action>&page=<page> – $1 ist der erste Platzhalter (.*) und $2 der zweite,
    wobei mit %{REQUEST_URI} hier alles hinter dem Host ‚php.nobs-nobody.de‘ in der Webadresse gemeint ist

Schaut Euch die Links auf der Schulungsseite php.nobs-nobdy.de an und Ihr werdet feststellen, dass sie alle in der Form

http://php.nobs-nobody.de/show/home/

notiert sind.

Damit kann Goole die Seite indizieren und den obigen Link kann man sich auch relativ gut merken.

Ein Gedanke zu „Modul Rewrite

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.