Philipp Söhnlein: mod_rewrite: Restrukturierung nach Relaunch

Tach,

bin gerade dabei eine Seite zu relaunchen, deren URL Struktur sich geändert hat. Bisher konnte ich mit mod_rewrite alle alten URLs auf die neuen umschreiben. Nur ein Problem (und einen Schönheitsfehler) habe ich noch.

Vorher gab es folgende URL:
http://host.de/de/index.php?section=jobs&id=3

Umgeschrieben soll das so ausshen:
http://de.host.de/unternehmen/jobs/3/

Mittels der folgenden Anweisungen klappt das normale umschreiben von
http://host.de/de/index.php?section=jobs in
http://host.de/unternehmen/jobs/

  
RewriteCond %{REQUEST_URI} ^/de/index.php$  
RewriteCond %{QUERY_STRING} ^section=jobs$  
RewriteRule .* http://de.host.de/unternehmen/jobs/ [R=301,L]  

Habe jetzt schon solche und ähnliche Konstrukte probiert:

  
RewriteCond %{REQUEST_URI} ^/de/index.php$  
RewriteCond %{QUERY_STRING} ^section=jobs&id=(.*)$  
RewriteRule .* http://de.nwl-laser.de/unternehmen/jobs/$1/ [R=301,L]  

Diese funktionieren aber nicht. Natürlich könnte ich jetzt für jede Möglichkeit (id=1, id=2 usw.) eine eigene Regel schreiben, aber das wäre arg statisch und geht sicher besser.

Wo liegt mein Fehler?

Ein Schönheitsproblem habe ich noch:
Das Umschreiben von http://host.de/de/index.php?section=jobs mittels der obrigen Regel endet in http://de.host.de/unternehmen/jobs/?section=jobs.
Ist zwar nicht tragisch, aber sieht halt unschön aus. Warum ist das so?

Ciao
Phil

  1. hi,

    Habe jetzt schon solche und ähnliche Konstrukte probiert: [...]

    Diese funktionieren aber nicht. Natürlich könnte ich jetzt für jede Möglichkeit (id=1, id=2 usw.) eine eigene Regel schreiben, aber das wäre arg statisch und geht sicher besser.

    Wo liegt mein Fehler?

    Was sagt das RewriteLog dazu (nachdem du es aktiviert, und die Stufe auch die höchste gestellt hast)?

    Ein Schönheitsproblem habe ich noch:
    Das Umschreiben von http://host.de/de/index.php?section=jobs mittels der obrigen Regel endet in http://de.host.de/unternehmen/jobs/?section=jobs.
    Ist zwar nicht tragisch, aber sieht halt unschön aus. Warum ist das so?

    Hast du das Flag QSA, Query String Append, verwendet?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hi,

      Was sagt das RewriteLog dazu (nachdem du es aktiviert, und die Stufe auch die höchste gestellt hast)?

      Da ich auf dem Server keinen Zugriff auf die Webserverconfig habe, habe ich es mal auf meinen Testserver probiert. Das Log spricht dann das:

      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (3) [per-dir /path/to/htdocs/kunde/] add path info postfix: /path/to/htdocs/kunde/de -> /path/to/htdocs/kunde/de/index.php
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (3) [per-dir /path/to/htdocs/kunde/] strip per-dir prefix: /path/to/htdocs/kunde/de/index.php -> de/index.php
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (3) [per-dir /path/to/htdocs/kunde/] applying pattern '.*' to uri 'de/index.php'
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (4) RewriteCond: input='/kunde/de/index.php' pattern='^/kunde/de/index.php$' => matched
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (4) RewriteCond: input='section=jobs&id=4' pattern='^section=jobs&id=(.+)$' => matched
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (2) [per-dir /path/to/htdocs/kunde/] rewrite de/index.php -> http://de.host.de/unternehmen/jobs//
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (2) [per-dir /path/to/htdocs/kunde/] explicitly forcing redirect with http://de.host.de/unternehmen/jobs//
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (2) [per-dir /path/to/htdocs/kunde/] trying to replace prefix /path/to/htdocs/kunde/ with /kunde/
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (1) [per-dir /path/to/htdocs/kunde/] escaping http://de.host.de/unternehmen/jobs// for redirect
      192.168.113.23 - - [31/May/2007:17:13:21 +0200] [host.de/sid#812d190][rid#82fe0d0/initial] (1) [per-dir /path/to/htdocs/kunde/] redirect to http://de.host.de/unternehmen/jobs//?section=jobs&id=4 [REDIRECT/301]

      "Matchen" tut er, nur er setzt das Ergebniss der Klammer nicht in $1 ein. Und er hängt den alten Query String an.

      Hast du das Flag QSA, Query String Append, verwendet?

      Nein.

      Bye
      Phil

      1. hi,

        "Matchen" tut er, nur er setzt das Ergebniss der Klammer nicht in $1 ein.

        Stimmt - da du diesen Match ja nicht aus einer RewriteRule, sondern einer RewriteCond erhältst - siehe http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteCond

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Tach,

          hab die Lösung gerade anderweitig gefunden:
          1. Auf die Matches aus RewriteCond kann man nicht mit $1 sondern mit %1 zugreifen.
          2. Den Query String bekommt man weg, in dem man einfach ein Fragezeichen an die Ziel URL anhängt. Sieht also nun so aus:

            
          RewriteCond %{REQUEST_URI} ^/de/index.php$  
          RewriteCond %{QUERY_STRING} ^section=jobs&id=(.+)$  
          RewriteRule .* http://de.host.de/unternehmen/jobs/%1/? [R=301,L]  
          
          

          Ciao
          Phil

          1. hi,

            hab die Lösung gerade anderweitig gefunden:

            1. Auf die Matches aus RewriteCond kann man nicht mit $1 sondern mit %1 zugreifen.

            Was heisst "anderweitigt"?
            Genau das stand doch an der Stelle, die ich verlinkt hatte ...

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }