Zur Navigation

URL Rewrite

URL umleiten und im Browser auch so anzeigen

1 Rotarius

Hallo

ich würde gerne ein URL umleiten:

Eingabe im Browser:

http://www.server.com/blume/rose

URL auf Server:

http://www.server.com/blume/index.php?blume_nr=1

Dies funktioniert mit mod_rewrite auch tadellos. Wird die Seite im Browser gezeigt,
steht nun aber in der URL: Zeile wieder:

http://www.server.com/blume/index.php?blume_nr=1

Wird nun ein Bookmark zu dieser Seite gespeichert, steht im Bookmark natürlich:

http://www.server.com/blume/index.php?blume_nr=1

Mein Ziel wäre es, dass der Browser immer nur

http://www.server.com/blume/rose

anzeigt und somit auch diese Adresse als Bookmark gespeichert wird. Dies hätte den Vorteil, dass ich die nr von rose ändern kann und die Bookmarks bei den Usern immer noch funktionieren.

Meine rewrite Zeile in der Apache httpd.conf sieht so aus:

RewriteEngine on
RewriteRule ^/blume/rose$ blume/index.php?blume_nr=1 [R]

Zusammenfassend besteht das Problem, dass die Bookmarks bei Änderungen der URL auf dem Server falsche Adressen beinhalten.

Wie löst man dies?

Danke und Gruss
Rotarius

17.09.2010 11:46

2 Jörg Kruse

Mit dem "[R]" machst du eine Weiterleitung, die sich in der Änderung der URL bemerkbar macht; wenn du die URL serverintern umschreiben möchtest, musst du dieses Flag weglassen.

Die Ziel-URL solltest du in der httpd.conf übrigens auch mit einem Slash beginnen

RewriteRule ^/blume/rose$ /blume/index.php?blume_nr=1

17.09.2010 14:23

3 Rotarius

Hallo Jörg,

danke für die prompte Antwort!

der fehlende Slash ist ein Tippfehler hier meinerseits....


Habe das [R] entfernt...nun bekomme ich:

Not Found

The requested URL /blume/rose was not found on this server.

Wenn ich das [R] wieder rein mache funktionierts, aber halt eben ändert auch die URL in der Adresszeile des Browsers....

An was könnte das liegen?

Gruss

Rotarius

17.09.2010 14:37

4 Jörg Kruse

Sollte eigentlich so funktionieren.

Wo hast du die Rule definiert - in einem passenden VirtualHost- und Directory-Container?

Und gibt es noch weitere Rules, die da vielleicht dazwischenfunken?

Die Pfade stimmen - d.h. die Datei index.php liegt im Verzeichnis blume unterhalb des DocumentRoot-Verzeichnis?

17.09.2010 15:03

5 Rotarius

Zitat von Jörg
Sollte eigentlich so funktionieren.

Wo hast du die Rule definiert - in einem passenden VirtualHost- und Directory-Container?

In keinem VirtualHost- und Directory-Container

Und gibt es noch weitere Rules, die da vielleicht dazwischenfunken?

Ja es gibt noch eine Rule:

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]


Die Pfade stimmen - d.h. die Datei index.php liegt im Verzeichnis blume unterhalb des DocumentRoot-Verzeichnis?

Ja das stimmt......

17.09.2010 15:44

6 Jörg Kruse

In keinem VirtualHost- und Directory-Container

D.h. es gibt auch keinen VirtualHost-Container für die betreffende Domain und alles ist global definiert?

Wie ist denn die Reihenfolge der Rules? das "L" hier sorgt z.B. dafür, dass keine weiteren Rule ausgeführt wird:

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]

17.09.2010 17:43

7 Rotarius

Ja ist alles global definiert.

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]

...hab ich auskommentiert..

ich versuchs nun so:

RewriteRule ^/blume/rose$ /blume/index.php?blume_nr=1 [P,QSA]

Dies funktioniert soweit. Das Problem ist nun, dass die Parameter nicht weitergereicht werden....

Wenn ich nun die Rewrite so schreibe:

RewriteRule ^blume/rose$ /blume/index.php?%{QUERY_STRING} [P,QSA]

und dann das Ding im Browser so aufrufe:

http://www.server.com/blume/rose?blume_nr=1

dann funktionierts.

Nun müsste ich wissen, wie man die Parameter in der Rewritezeile übergeben kann.....?


28.09.2010 08:36

8 Jörg Kruse

Eigentlich sollte das "QSA" schon dafür sorgen, dass der Query String wieder hintendran gehängt wird.

Funktioniert denn sowas:

RewriteRule ^/blume/rose$ /blume/index.php?blume_nr=1&%{QUERY_STRING} [P,QSA]

28.09.2010 13:41

9 Rotarius

So wie ich das verstanden habe, wird der %{QUERY_STRING} nur hinten
anghängt wenn auch im Aufruf Parameter mitgegeben werden.

Mein Ziel is im Prinzip einfach:

Aus

http://www.server.com/rose

soll intern, d.h. ohne das die URL im Browser ändert der Inhalt
von

http://www.server.com/blumen/index.php?id=rose

im Browser angezeigt werden. Die Rewriterule mit [R] hinten dran funktioniert genau wie ich will. Nun möchte ich aber, dass die URL im Browser nicht ändert. Das erreiche ich mit dem Flag [P] (Proxy). Nur dann werden keine Parameter in der internen Weiterleitung übergeben. %{QUERY_STRING} ist ja denn leer, weil ja im Aufruf keine Parameter angeben wurden. Mein Problem liegt darin, dass ich nicht weiss wie ich eine interne Weiterleitung mit Parametern erstellen kann...

28.09.2010 14:05

10 Jörg Kruse

Welchen Parameter meinst du - id in diesem Beispiel? Wenn du id dynamisch ersetzen möchtest, kannst du diese links z.B. als "(.+)" speichern und rechts mit "$1" wieder aufnehmen

RewriteRule ^blume/(.+)$ /blume/index.php?id=$1 [P,QSA]

Falls du was anders meinst, bitte ein konkretes Beispiel geben

28.09.2010 15:58

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]