mod_rewrite
Thomas
- sonstiges
Hi,
stehe nach viel googlen ziemlich auf dem Schlauch. Vielleicht kann ja jemand helfen:
ich möchte gerne http://(www.)domain.tld/willkommen und auch http://(www.)domain.tld/impressum
auf
http://(www.)domain.tld/index.php?cat=2&article=5 und http://(www.)domain.tld/index.php?cat=4&article=2
umleiten.
Wie stelle ich das via mod_rewrite an?
Vielleicht bin ich auch nur zu müde/doof!
Danke
Thomas
@@Thomas:
nuqneH
Wie stelle ich das via mod_rewrite an?
Die Frage sollte sein: Wie stellst du das ohne mod_rewrite an? Mit [link:http://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect@title=Redirect]
.
Qapla'
Hallo,
Die Frage sollte sein:
Das scheint mir eine ganz andere Frage als die von Thomas.
Wie stellst du das ohne mod_rewrite an? Mit
[link:http://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect@title=Redirect]
.
Ich nehme nicht an, dass hier eine externe HTTP-Weiterleitung gewünscht ist, sondern ein internes Umschreiben der URL auf eine andere. Vielleicht ist *zusätzlich* ein Permanent Redirect erwünscht, wenn von alten URLs auf neue umgestellt wird.
Und die Alias-Direktive hilft hier auch nicht, weil das Ziel kein Verzeichnis oder Datei ist, sondern eine URL ist.
Also: mod_rewrite scheint mir angebracht.
Mathias
Hallo,
ich möchte gerne http://(www.)domain.tld/willkommen und auch http://(www.)domain.tld/impressum
auf
http://(www.)domain.tld/index.php?cat=2&article=5 und http://(www.)domain.tld/index.php?cat=4&article=2
umleiten.
Vielleicht übersehe ich etwas, aber was spricht gegen ein einfaches:
RewriteEngine on
RewriteRule ^/willkommen$ /index.php?cat=2&article=5
RewriteRule ^/impressum$ /index.php?cat=4&article=2
Oder explizit zum Host mit oder ohne www weiterleiten:
RewriteRule ^/willkommen$ http://www.example.org/index.php?cat=2&article=5
usw.
Das ist dann ein interner Redirect, wenn www.example.org bereits der aktuelle Host ist, ansonsten ein externer HTTP-Redirect.
Mathias
Hi,
Vielleicht übersehe ich etwas, aber was spricht gegen ein einfaches:
RewriteEngine on
RewriteRule ^/willkommen$ /index.php?cat=2&article=5
RewriteRule ^/impressum$ /index.php?cat=4&article=2
Die führenden Slashes in den Pattern sind da fehl am Platze, wenn das per .htaccess konfiguriert wird – in dem Kontext ist der Pfad zum aktuellen Verzeichnis immer schon „abgeschnitten“ worden. (Und wenn sich das ganze direkt unter dem Domain-Root abspielt, dann ist dieser abgeschnittene „Pfad zum aktuellen Verzeichnis“ einfach "/".) Und die führenden Slashes in den Ersetzungen braucht es hier m.E. auch nicht.
RewriteRule ^willkommen$ index.php?cat=2&article=5
RewriteRule ^impressum$ index.php?cat=4&article=2
Oder explizit zum Host mit oder ohne www weiterleiten:
RewriteRule ^/willkommen$ http://www.example.org/index.php?cat=2&article=5
usw.Das ist dann ein interner Redirect, wenn www.example.org bereits der aktuelle Host ist, ansonsten ein externer HTTP-Redirect.
Dann wirst du bei Aufruf von http://example.org/willkommen aber extern auf http://www.example.org/index.php?cat=2&article=5 weitergeleitet, und das ist idR. nicht das beabsichtigte Verhalten:
Das /willkommen willst du ja nach außen hin beibehalten, und auf http://www.example.org/willkommen weitergeleitet werden.
Das macht man also besser mit einer vorangestellten extra Regel, die nur die Aufgabe hat auf Aufruf über die non-www-Version des Hostnamens zu prüfen und dann auf die www-Version weiterzuleiten (oder vice versa) – und anschließend die gegenwärtige „Runde“ des Rewritings für beendet erklärt, mittels [L]-Flag.
MfG ChrisB
Hallo!
Die führenden Slashes in den Pattern sind da fehl am Platze, wenn das per .htaccess konfiguriert wird – in dem Kontext ist der Pfad zum aktuellen Verzeichnis immer schon „abgeschnitten“ worden.
OK.
Und die führenden Slashes in den Ersetzungen braucht es hier m.E. auch nicht.
Das hatte ich http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule entnommen, wo die Variante ohne Slashes als »invalid, not supported« gekennzeichnet war. Aber ich glaube dir gerne, denn andere Beispiele verzichten darauf.
Dann wirst du bei Aufruf von http://example.org/willkommen aber extern auf http://www.example.org/index.php?cat=2&article=5 weitergeleitet … Das macht man also besser mit einer vorangestellten extra Regel
o_O Ja, du hast völlig Recht. Danke für die Ergänzung.
Mathias
Hi,
Und die führenden Slashes in den Ersetzungen braucht es hier m.E. auch nicht.
Das hatte ich http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule entnommen, wo die Variante ohne Slashes als »invalid, not supported« gekennzeichnet war.
Die Beispiele, wo das steht und "otherpath$1" als Substituion verwendet wird, beziehen sich auf Konfiguration des Rewritings in der httpd.conf (siehe oben drüber, “Inside per-server configuration (httpd.conf)”) – deshalb da auch der führende Slash im Pattern.
Ein Stück weiter unten finden sich Beispiele für den Fall “Inside per-directory configuration” – da ist kein Slash am Start des Patterns, und auch die Substitution "otherpath$1" ist dort nicht als invalid gekennzeichnet.
Aber ich glaube dir gerne, denn andere Beispiele verzichten darauf.
Wie gesagt, der Kontext in dem man das ganze konfiguriert – zentrale Server-Konfiguration vs. Konfiguration auf Verzeichnis-Ebene via .htaccess – bedingt ein paar Unterschiede. Da muss man jeweils schauen, welchen Fall man vorliegen hat und wie demzufolge Pfade im Pattern und der Substitution anzugeben sind.
MfG ChrisB
Hi,
ich habe jetzt die Rules so eingestellt, funktioniert auch:
RewriteRule ^willkommen/ index.php?cat=2&article=5 [QSA,L]
RewriteRule ^impressum/ index.php?cat=4&article=2 [QSA,L]
nur wie bewerkstellige ich es jetzt, dass jeder andere Aufruf, welcher nicht in den obigen Rules explizit angegeben wurde auf domain.tld/willkommen umgeleitet wird?
Danke schön
Thomas
Hi,
ich habe jetzt die Rules so eingestellt, funktioniert auch:
RewriteRule ^willkommen/ index.php?cat=2&article=5 [QSA,L]
RewriteRule ^impressum/ index.php?cat=4&article=2 [QSA,L]nur wie bewerkstellige ich es jetzt, dass jeder andere Aufruf, welcher nicht in den obigen Rules explizit angegeben wurde auf domain.tld/willkommen umgeleitet wird?
Für „jeden“ möglichen Request willst du das vermutlich nicht – denn wenn auch die Requests nach Bildern, Stylesheets und Scripten nach /willkommen umgeschrieben werden, dann wird vermutlich nicht mehr viel funktionieren auf der Seite.
Üblich ist, dass man existierende Dateien und Verzeichnisse vom Rewriting ausschließt – und dann nur „den Rest“, Anfragen nach nicht real existierenden Verzeichnissen/Dateien, umschreibt.
Schau dir dazu in der Beschreibung zur RewriteCond an, wie die Flags !-f und !-d genutzt werden können, um eine nachfolgende RewriteRule nur abhängig davon ausführen zu lassen. (http://httpd.apache.org/docs/2.2/rewrite/remapping.html hat weitere Beispiele zur Verwendung.)
MfG ChrisB