Thomas: mod_rewrite

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

  1. @@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'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. 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

  2. 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

    1. 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

      --
      Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
      1. 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

        1. 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

          --
          Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
  3. 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

    1. 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

      --
      Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/