Du bist nicht angemeldet.

[ htaccess ] Kanonische URIs

Lieber Besucher, herzlich willkommen bei: WebStyleBoard. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Mittwoch, 16. Juli 2003, 12:44

Kanonische URIs

Hallo WSB-Jünger! :)

Mir hat das bei meinem wirrtuellen Server schon lange am Herzen gelegen und nun habe ich mir eine Lösung erarbeitet, die ich Euch nicht vorenthalten will. Viel Erfolg!

Kanonische URIs mit mod_rewrite (.htaccess)

Voraussetzungen
  • Apache-Webserver
  • mit installiertem mod_rewrite-Modul
  • AllowOverride richtig gesetzt (sonst nix .htaccess)


Das Problem

Eine Webressource (bleistiftsweise eine HTML-Seite) ist unter einer Adresse verfügbar. Unter dieser Adresse ist die Ressource für Suchmaschinen und andere Seiten, die Links setzen, verfügbar. Allerdings sind viele Server so konfiguriert, dass eine Ressource unter mehreren Adressen verfügbar ist. Das hat den Nachteil, dass der Browser-Cache der Besucher nicht richtig funktioniert, da er die verschiedenen Adressen als verschiedene Seiten ansieht, dass schon besuchte Links auf einmal als neu erscheinen (da andere Adresse) oder sich das Google-Ranking verschlechtert, da sich der PageRank auf die Adressen aufteilt, die die Ressource liefern.

Also sollten wir dafür sorgen, dass eine Ressource unter genau einer Adresse erreichbar ist. Wie wir das erreichen, ohne die redundanten Adressen aufzugeben, zeige ich Euch hier.

Konkret

Die Ressource http://www.memowe.de/webauthoring/ war bisher unter vier Adressen verfügbar, nämlich:
  • http://www.memowe.de/webauthoring/index.html
  • http://memowe.de/webauthoring/index.html
  • http://www.memowe.de/webauthoring/
  • http://memowe.de/webauthoring/

Bei mir ist der Fall, dass auch noch die Domain memoweb.de (soll ausgemustert werden) auf diese Ressourcen zeigt. Es kommen also weitere vier Adressen für ein und denselben Inhalt dazu:
  • http://www.memoweb.de/webauthoring/index.html
  • http://memoweb.de/webauthoring/index.html
  • http://www.memoweb.de/webauthoring/
  • http://memoweb.de/webauthoring/

Ich will aber, dass die Ressource die Adresse http://www.memowe.de/webauthoring/ hat und nicht sieben andere dazu.

Der Lösungsansatz

Der Server soll, wenn er eine Anforderung einer redundanten Adresse bekommt, einen Statuscode 301 (redirect permanently) und dazu einen Location-Header mit der richtigen Adresse senden, so dass sofort auf die richtige Adresse weitergeleitet wird. Dann steht in der Adresszeile immer die richtige Adresse, die man dann bequem bookmarken oder verlinken kann. Wenn der GoogleBot auf einen 301-Redirect stößt, passt er die Einträge in der Google-Datenbank an, so dass, wenn der Bot dann da war, die Ressource nur noch unter einer einzigen Adresse bekannt ist.

mod_rewrite...

... ist ein Apache-Modul, ist Voodoo und kann sowas. Hier die Zeilen mit Kommentar, die in die .htaccess-Datei gehören:

Quellcode

1
RewriteEngine   on
Schaltet die RewriteEngine an, ohne die nix geht.

Nun werden die Bedingungen überprüft, die erfüllt sein müssen, damit der Server einen 301er schickt:

Quellcode

1
RewriteCond     %{HTTP_HOST}                    !^www\.                 [NC,OR]
Damit ist die vom Webserver bereitgestellte Variable HTTP_HOST gemeint. Sie enthält in meinem Fall einen der vier möglichen Werte
  • www.memoweb.de
  • www.memowe.de
  • memoweb.de
  • memowe.de
Der erweiterte reguläre Ausdruck !^www\. matched dann, wenn HTTP_HOST nicht mit "www." beginnt. Der Schalter NC bedeutet, dass case-insensitiv gematched wird. Der Schalter OR bedeutet, dass eine weitere Bedingung mit einem logischen Oder verknüpft wird.

Quellcode

1
RewriteCond     %{HTTP_HOST}                    memoweb                 [NC,OR]
Dieser reguläre Ausdruck ist ziemlich trivial. Er matched alle HTTP_HOSTs, die "memoweb" enthalten.

Quellcode

1
RewriteCond     %{THE_REQUEST}                  index\.(html|php)       [NC]
Dieser reguläre Ausdruck matched alle Adressen, die auf index.html oder index.php enden, also Adressen, die redundanterweise eine Directory-Index-Datei benennen, etwa .../privat/index.html statt .../privat/.

Wenn eine (logisches Oder) dieser Bedingungen erfüllt sind, tritt folgende RewriteRule in Kraft:

Quellcode

1
RewriteRule     ^(.*)index.(html|php)$          http://www.memowe.de/$1 [NC,R=301]
Sie matched den gesamten URI ab dem Webroot ohne ein eventuell anhängendes index.html oder index.php. Der Teilstring des URI zwischen Webroot und index.html oder index.php (bei http://www.memowe.de/webauthoring/index.html ist das webauthoring/) wird an den neuen URI http://www.memowe.de/ angehängt bevor dieser mit dem Schalter R=301 mit einem 301 Redirect permanently an den Client geschickt wird.

So werden zu beliebigen Adressen mit unerwünschten Eigenschaften (kein "www." am Anfang, memoweb statt memowe oder index.html oder index.php am Ende) neue Adressen generiert, die als der erwünschte Redirect den Client veranlassen, die Ressource von der richtigen Adresse zu laden. Und das ist ja das, was wir eigentlich wollten:

Überprüfung

Zitat

> lynx --head --dump http://www.memowe.de/webauthoring/index.html | egrep "HTTP|Location"
HTTP/1.1 301 Moved Permanently
Location: http://www.memowe.de/webauthoring/

Zitat

> lynx --head --dump http://memowe.de/webauthoring/index.html | egrep "HTTP|Location"
HTTP/1.1 301 Moved Permanently
Location: http://www.memowe.de/webauthoring/

Zitat

> lynx --head --dump http://www.memowe.de/webauthoring/ | egrep "HTTP|Location"
HTTP/1.1 200 OK

Zitat

> lynx --head --dump http://memowe.de/webauthoring/ | egrep "HTTP|Location"
HTTP/1.1 301 Moved Permanently
Location: http://www.memowe.de/webauthoring/

Zitat

> lynx --head --dump http://www.memoweb.de/webauthoring/index.html | egrep "HTTP|Location"
HTTP/1.1 301 Moved Permanently
Location: http://www.memowe.de/webauthoring/

Zitat

> lynx --head --dump http://memoweb.de/webauthoring/index.html | egrep "HTTP|Location"
HTTP/1.1 301 Moved Permanently
Location: http://www.memowe.de/webauthoring/

Zitat

> lynx --head --dump http://www.memoweb.de/webauthoring/ | egrep "HTTP|Location"
HTTP/1.1 301 Moved Permanently
Location: http://www.memowe.de/webauthoring/

Zitat

> lynx --head --dump http://memoweb.de/webauthoring/ | egrep "HTTP|Location"
HTTP/1.1 301 Moved Permanently
Location: http://www.memowe.de/webauthoring/


Wenn Ihr das zu hause ausprobieren wollt aber nur eine Domain habt, könnt Ihr ja einfach die RewriteCondition, in der "memoweb" gematched wird, weglassen. Ich hoffe, dass diese kleine Zusmmenstellung irgendjemandem weiterhilft. Mir hat sie weitergeholfen.

Beste Wünsche!
Mirko "memowe" Westermeier :)

Edit: PS: Christoph Schneegans: Kanonische Adressen

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »memowe« (22. August 2003, 19:26)


2

Mittwoch, 16. Juli 2003, 13:24

RE: [htaccess] Kanonische URIs

mod_rewrite verschreibt sich bei mir irgendwie ... :D

Wenn ich z. B. http://www.sv-einigkeit.de/content/verein/index.shtml eingebe, wird die Adresse in http://www.sv-einigkeit.de/home/earolusr…content/verein/ geändert ...

Hier die mod_rewrite-Anweisungen

Quellcode

1
2
3
4
5
6
7
RewriteEngine   on
RewriteCond     %{HTTP_HOST}                    !^www\.                 [NC,OR]
RewriteCond     %{HTTP_HOST}                    autenzell                 [NC,OR]
RewriteCond     %{HTTP_HOST}                    schuetzenverein-autenzell-rettenbach                 [NC,OR]
RewriteCond     %{HTTP_HOST}                    einigkeit-autenzell-rettenbach                 [NC,OR]
RewriteCond     %{THE_REQUEST}                  index\.(shtml|php)       [NC]
RewriteRule     ^(.*)index.(shtml|php)$          [URL]http://www.sv-einigkeit.de/[/URL]$1 [NC,R=301]

Wieso denn das?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DukeXP« (16. Juli 2003, 13:25)


3

Mittwoch, 16. Juli 2003, 18:20

RE: [htaccess] Kanonische URIs

Zitat

Original von memowe
... oder sich das Google-Ranking verschlechtert, da sich der PageRank auf die Adressen aufteilt, die die Ressource liefern.
Kannst Du diesen Punkt bitte näher veranschaulichen? ?( Danke. :)

4

Mittwoch, 16. Juli 2003, 19:20

RE: [htaccess] Kanonische URIs

ein kleines Bleistift....

Google-Einträge vorher:
memowe.de (5 Links)
www.memowe.de (4 Links)
memoweb.de (2 Links)
www.memoweb.de (1 Link)

Google wird diese Links sehr weit unten anzeigen, weil andere WebAuthoring-Seiten bspw. 7 Links haben, die auf sie verweisen. Wenn Google merkt, dass das dieselbe Datei ist (weil auf dieselbe Datei mit "301 Permanent Move" weitergeleitet wird), dann wird er das ändern.

Google-Eintrag nachher:
www.memowe.de (12 Links)

was sicherlich etwas weiter oben anzusiedeln ist. ;)
Signatur von »Alex« Man muss nichts sehen, um zu sehen, dass man nichts sieht, aber man muss etwas sehen, um zu sehen, was man nicht sieht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Alex« (16. Juli 2003, 19:20)


5

Donnerstag, 17. Juli 2003, 15:04

RE: [htaccess] Kanonische URIs

(siehe meinen Beitrag oben)

Funktioniert mod_rewrite nur bei bestimmten Server-Konfigurationen richtig oder muß memowe's Beispiel evtl. für einige Server abgeändert werden? Das Ergebnis, das mod_rewrite auf meinem Server ausspuckt, ist zu nichts zu gebrauchen - die URL funktioniert nicht. :(

6

Donnerstag, 17. Juli 2003, 16:42

RE: [htaccess] Kanonische URIs

Zitat

Original von DukeXP
Funktioniert mod_rewrite nur bei bestimmten Server-Konfigurationen richtig oder muß memowe's Beispiel evtl. für einige Server abgeändert werden?
Sorry, ich weiß in Deinem konkreten Fall nicht, woran es liegt. Wie man schreibt ist mod_rewrite Voodoo und nicht unbedingt einfach. Ich bin damit nicht besonders bewandert und habe nur in meinem konkreten Fall damit einen Erfolg erzielt, den ich Euch nicht vorenthalten wollte. Vielleicht findest Du selbst mit dem Studium der mod_rewrite-Dokumentation weitere Lösungsansätze?

Viel Erfolg!
Mirko :)

7

Donnerstag, 21. August 2003, 21:35

Hallo!

Ich habe es gerade auf meinem Server eingebaut, und es funktioniert ganz hervorragend.

Danke, für diese Veranschaulichung, Mirko! :)

Vielleicht sollte man noch dazusagen, dass das [/URL] und [URL] in memowes CODE-Zeilen nicht Teil der Regel ist. :P


Chacabaou.[/url]

8

Freitag, 22. August 2003, 00:53

@ Chacabaou: Hast du vielleicht eine Idee, warum das ganze bei mir nicht funktioniert? :(

9

Freitag, 22. August 2003, 01:28

[q=DukeXP]@ Chacabaou: Hast du vielleicht eine Idee, warum das ganze bei mir nicht funktioniert?[/q]
Ja, habe ich.

Und die Lösung steht genau einen Beitrag über deinem. ;)


Chacabaou.

10

Freitag, 22. August 2003, 18:28

:evil: ups! - Hab' ich irgendwie gestern abend / heute früh nicht gepeilt.

Danke für den Hinweis! :))

[Edit]
Es funktioniert! :))
[/Edit]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DukeXP« (22. August 2003, 19:59)


11

Freitag, 22. August 2003, 23:33

Mirkos Lösung hat sich als unzureichender herausgestellt, als mir meine Intuition anfangs einbläute.

Daniel: 1 Punkt
Voodoo: 0 Punkte :D

Hier meine Abwandlung im Einsatz auf http://www.smiliez.de/

Quellcode

1
2
3
4
RewriteCond     %{HTTP_HOST} !^www\.                                    [NC,OR]
RewriteCond     %{HTTP_HOST} com                                        [NC,OR] 
RewriteCond     %{THE_REQUEST} index\.(htm|html|php)                    [NC]
RewriteRule     ^(.*)(index\.(htm|html|php))?$ http://www.smiliez.de/$1 [NC,R=301]
Die bisherige Regel matchte nur auf URIs, die entweder mit einem / oder einem /index.(html|php) endeten.
So wurde bei mir beispielsweise http://smiliez.de/faq.php bisher nicht korrigiert.


Viel Spaß damit wünscht,
Chacabaou.

12

Freitag, 22. August 2003, 23:42

Nur um sicherzustellen, dass ich das auch verstehe ... ;)

Du hast die Zeile mit dem "%{HTTP_HOST} com" hinzugefügt - für was steht da "com"? - Soll das die tld sein?

13

Samstag, 23. August 2003, 03:39

[q=DukeXP]Du hast die Zeile mit dem "%{HTTP_HOST} com" hinzugefügt - für was steht da "com"? - Soll das die tld sein?[/q]
Ja, das ist ein Äquivalent zu Mirkos "%{HTTP_HOST} memoweb".
"smiliez\.com" wollte bei mir nicht so recht funktionieren, also habe ich einfach auf "com" gematcht, damit alle Besucher von http://www.smiliez.com genauso auf der DE-Domain landen.

Übrigens habe ich gerade einen schwerwiegenden Fehler in meiner Version entdeckt.
Sobald die RewriteCond %{THE_REQUEST} index\.(htm|html|php) zutrifft, verursacht die RewriteRule eine Rekursion.
Und zwar wird das im URI befindliche "index.htm" schon vom (.*) geschluckt, und das (index\.(htm|html|php))? wird ignoriert, da "?" für eine Anzahl von 0 oder 1 steht.
Das hat zur Folge, dass Besucher von http://www.smiliez.de/index.php immer wieder zum selben URI umgeleitet wurden.

Ich habe es schon mit einer seperaten RewriteCond-RewriteRule-Kombination probiert, allerdings endet das immer in "http://www.smiliez.de/http://www.smiliez.de/". So habe ich die RewriteCond mit den Directoryindices mal vorerst herausgenommen.

Fällt vielleicht jemandem eine Lösung ein?
Björn -- der Mann, der mir reguläre Ausdrücke nahelegte? :D


Chacabaou.

14

Samstag, 23. August 2003, 03:50

Klar, (irnkwas)*(irnkwasanderes)? matched immer, da alles optional ist. Zudem ist zu beachten, dass * gierig ist -- da also (irnkwasanderes)? optional ist, wird kein Backtracking verwendet und die Backreference $1 wird mit dem gesamten String gefüllt.

Du könntest doch einfach auf zwei RewriteRules bauen. Eine für einzeln angeforderte "Dateien" und eine für angeforderte "Verzeichnisse". Oder sehe ich das lafhsc? Wäre das nicht wesentlich einfacher?

Gruß
Mirko :)

15

Samstag, 23. August 2003, 04:04

Hallo Mirko!

Falls du damit eine alleinstehende Rule meinst, die ausschließlich dem Zwecke dient, etwaige index.(htm|html|php)-Anhängsel zu entfernen; das habe ich probiert:

Quellcode

1
RewriteRule    ^(.*)index\.(htm|html|php)$ $1                          [NC,R=301]
Ohne Erfolg.

Mit http://www.smiliez.de/index.php bin ich auf http://www.smiliez.de/html/ gelandet, weiß der Teufel, wieso.

Voodoo.


Chacabaou.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gelöscht0001« (23. August 2003, 04:06)


16

Montag, 25. August 2003, 16:47

Kann mir bei folgenden "Problem" mod_rewrite evtl. auch weiterhelfen?

Sämtliche HTML-Seiten liegen im Verzeichnis "content" - also lautet die Adresse der Seiten http://domain.de/content/bereich/seite/

Könnte man da irgendwie das Verzeichnis "content" verstecken und dafür sorgen, dass auch Links ohne "/content" funktionieren?

17

Montag, 25. August 2003, 16:57

Hallo.

Selbstverständlich sollte das funktionieren.

Allerdings machst du "http://www.domain.tld" dann abhängig von /content.
Unterhalb dessen wird da nichts mehr erreichbar sein.

Also ich sag mal, frei aus dem Bauch heraus:

Quellcode

1
2
RewriteEngine on
RewriteRule ^[^/content](.*)$ http://www.domain.tld/content/$1 [NC]
Keine Ahnung, ob das klappt.
Berichte uns! :)


Chacabaou.

18

Montag, 25. August 2003, 18:25

Funktioniert nicht ... irgendwie kann man da gar keine Reaktion feststellen. ?(

19

Montag, 25. August 2003, 20:20

Hallo!

So, Lösung gefunden:

Quellcode

1
2
3
RewriteEngine on
RewriteCond %{REQUEST_URI}      !^/content      [NC]
RewriteRule ^(.*)$              /content/$1     [NC]

(Erfolgreich getestet. :) )


Chacabaou.

20

Montag, 25. August 2003, 21:18

Ich glaub, ich lasse das doch lieber - das bringt die ganzen Server-Pfade durcheinander. Der Pfad zum Stylesheet, etc. funktioniert nicht mehr.

Wird wohl einfacher sein, wenn ich einfach die Verzeichnis-Struktur auf dem Server ändere und damit das Verzeichnis "content" kille. ;)

Trotzdem vielen Dank! :))