Powl: mod rewrite

Hallo,

"Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. "
-- Brian Moore
bem@news.cmc.net
dem kann man sich nur anschließen...

Folgendes Problem: Dynamische Seiten sollen über statische URL's zugänglich sein. Also etwas wie:
http://example.org/home -> http://example.org/index.php?page=home
funktioniert!
ferner sollen Anfragen an Verzeichnisse, nicht umgeschrieben werden, also listing oder 403er - funktioniert auch!
Dateien sollen aber ausgegeben werden, z.B.
http://example.org/image/image1.gif
funktioniert auch!
Was ich aber nicht schaffe ist, daß nicht nur
http://example.org/home -> http://example.org/index.php?page=home
sondern auch
http://example.org/home.* -> http://example.org/index.php?page=home
funktioniert.
Die .htaccess enthält folgendes:

RewriteEngine on
RewriteBase /
#Wenn Anfrage keine Datei...
RewriteCond %{SCRIPT_FILENAME} !-f
#...oder Verzeichnis
RewriteCond %{SCRIPT_FILENAME} !-d
#dann umleiten zu:
RewriteRule ^(.*)$ index.php?page=$1 [L]

was muß ich da ergänzen. Mir fällt irgendwie nicht das passende ein, alle bisherigen Versuche enden in einem 500er :(

vielen Dank für die Hilfe
^da Powl

  1. echo $begrüßung;

    was muß ich da ergänzen. Mir fällt irgendwie nicht das passende ein, alle bisherigen Versuche enden in einem 500er :(

    Diese Aussage ist so hilfreich, wie "Es ist ein Fehler aufgetreten."
    Schau bitte erst einmal im Error-Log nach, was konkret beanstandet wird und versuche ein RewriteLog einzurichten (Direktiven RewriteLog und RewriteLogLevel, einstellbar in der Server- oder VHost-Konfiguration).

    echo "$verabschiedung $name";

    1. echo "Hallo";

      Diese Aussage ist so hilfreich, wie "Es ist ein Fehler aufgetreten."
      Schau bitte erst einmal im Error-Log nach, was konkret beanstandet wird und versuche ein RewriteLog einzurichten (Direktiven RewriteLog und RewriteLogLevel, einstellbar in der Server- oder VHost-Konfiguration).

      Irgendwie war ich mir nicht bewusst, daß das Problem an dem ich nage, dermaßen komplex und tiefschürfend ist (ich meine: für mich natürlich schon, aber für jemanden, der sich mit der Materie auskennt?), daß es derartiger Auszüge aus dem RewriteLog bedürfte.
      Eigentlich hätte ich vermutet, daß man an der RewriteRule nur ein paar Zeichen ändern müßte, um den gewünschten Effekt zu erreichen.
      Mir RegEx habe ich aber (noch? hoffentlich!) ernsthafte Probleme; im Prinzip verstehe ich wohl wie es gehen müßte, aber es funktioniert nur bedingt.
      Wahrscheinlich macht auch hier Übung den Meister. Sicher sogar.

      Aber wenn Du darauf bestehst, werde ich mal sehen, ob ich den file auf dem Server erreichen kann/darf und ihn dann hier posten.
      Hoffentlich ist deine scrollbar lang genug ;)
      Ob das dann aber nicht etwas "oversized" ist für so ein relativ simples Problem (ich meine: für mich natürlich nicht, aber für jemanden, der sich mit der Materie auskennt?)vermag ich nicht endgültig zu beurteilen, lediglich zu erahnen.
      Da muß ich mich dann schon auf Dein Urteil verlassen...
      Aber Du magst mir ja gerne einmal antworten, ob Informationen aus dem RewriteLog für eine entsprechende Problemlösung wirklich und wahrhaftig _zwingend_ erforderlich sind. Oder ginge es auch zu Not ohne?

      Eigentlich sollte nur
      http://example.org/home -> http://example.org/index.php?page=home
      sowie
      http://example.org/home.* -> http://example.org/index.php?page=home
      entsprechend umgesetzt werden. Wobei es noch passender wäre, wenn
      home.* sich auf
      .(x)htm(l) beschränken würde.

      echo "Danke dennoch fürs zu"lesen" <br />
      ^da Powl";

      1. echo $begrüßung;

        Diese Aussage ist so hilfreich, wie "Es ist ein Fehler aufgetreten."
        Schau bitte erst einmal im Error-Log nach, was konkret beanstandet wird und versuche ein RewriteLog einzurichten (Direktiven RewriteLog und RewriteLogLevel, einstellbar in der Server- oder VHost-Konfiguration).

        Irgendwie war ich mir nicht bewusst, daß das Problem an dem ich nage, dermaßen komplex und tiefschürfend ist (ich meine: für mich natürlich schon, aber für jemanden, der sich mit der Materie auskennt?), daß es derartiger Auszüge aus dem RewriteLog bedürfte.

        Wie komplex das Problem ist, weiß ich nicht. Das ist auch nicht weiter interessant. Ob das RewriteLog nötig ist, ist auch noch nicht gesagt. Zuerst wäre ein Blick in das Error-Log hilfreich, um die Ursache des 500er zu ermitteln. Danach kann man immer noch entscheiden, ob das Rewrite-Log nötig/hilfreich ist, um den Fehler zu finden oder zu verstehen.

        Eigentlich hätte ich vermutet, daß man an der RewriteRule nur ein paar Zeichen ändern müßte, um den gewünschten Effekt zu erreichen.

        Ich weiß es nicht, aber der Weg zur Erkenntnis geht über die genaue Analyse des Problems.

        Wahrscheinlich macht auch hier Übung den Meister. Sicher sogar.

        Eben. Deswegen knalle ich dir nicht einfach ur die Lösung vor den Latz (wenn ich sie denn aus dem Stegreif wüsste), sondern zeige dir den Weg, wie du deinem Problem auf den Grund gehen kannst.

        Aber wenn Du darauf bestehst, werde ich mal sehen, ob ich den file auf dem Server erreichen kann/darf und ihn dann hier posten.

        Nein, ich bestehe ganz und gar nicht darauf. Ich mache nur Vorschläge, die du annehmen oder ignorieren kannst. Mehr nicht.

        Ob das dann aber nicht etwas "oversized" ist für so ein relativ simples Problem (ich meine: für mich natürlich nicht, aber für jemanden, der sich mit der Materie auskennt?)vermag ich nicht endgültig zu beurteilen, lediglich zu erahnen.

        Wie gesagt, um zu erkennen, ob das Problem simpel oder komplex ist, sollte es zuerst analysiert werden. Dies geht manchmal schnell, manchmal langsamer.

        Da muß ich mich dann schon auf Dein Urteil verlassen...

        Nein, dieser Zwang besteht nicht.

        Aber Du magst mir ja gerne einmal antworten, ob Informationen aus dem RewriteLog für eine entsprechende Problemlösung wirklich und wahrhaftig _zwingend_ erforderlich sind. Oder ginge es auch zu Not ohne?

        Kommt, wie gesagt, darauf an.
        Neulich hatte ich auch einen "simplen" 500er beim Rewriten. Das Error-Log sagt aus, dass es eine Endlos-Schleife gegeben hat. Hier war mir dann das Rewrite-Log von Nutzen, weil es mir aufzeigte, welche internen Prozesse mod_rewrite ausgeführt hat, und wie es zu der Schleife kam. Die Lösung in meinem Fall war das Weglassen eines /. Sieht letzten Endes sehr simpel aus, doch das weiß man vor der Problemanalyse nicht, wenn man nicht auf bereits gemachte Erfahrung zurückgreifen kann. Außerdem weiß ich nun, dass die Angabe eines absoluten Pfades als Ziel nach Beendigung der ersten URL-Umschreibung einen erneuten internen Request veranlasst, der dann den gleichen Rewrite-Vorgang noch einmal durchläuft, falls er wieder auf die gleiche .htaccess trifft. Gibt man das Ziel relativ an, merkt mod_rewrite, dass es diese Umschreibung bereits vornahm und beendet sich ordentlich. Bei der absoluten Pfad-Angabe lief es in die Endlos-Schleife.

        Vielleicht ist es bei dir das Gleiche, aber in Form des RewriteBase /
        Doch diese Vermutung war mir zu vage, um sie jetzt schon zu äußern. Ich wollte mindestens den Wortlaut des Error-Log abwarten.

        echo "$verabschiedung $name";

  2. Hello out there!

    http://example.org/home.* -> http://example.org/index.php?page=home

    RewriteRule ^(.*)$ index.php?page=$1 [L]

    ^^^^
    Du möchtest in diesem Ausdruck also nicht alle Zeichen haben, sondern nur die bis zum ersten '.'?

    See ya up the road,
    Gunnar

    --
    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
    1. Hallo,

      Du möchtest in diesem Ausdruck also nicht alle Zeichen haben, sondern nur die bis zum ersten '.'?

      Jain-
      Sofern kein .xxx folgt ja, nur wenn dem ein .xxx folgt, dann bis zu dem ersten _._ .
      Also eben beide Ausdrücke gleichzeitig. Beide unabhängig von einander habe ich hinbekommen, aber zusammen bekomme ich eben nicht zusammen ;)

      ^da Powl

      1. Hello out there!

        Du möchtest in diesem Ausdruck also nicht alle Zeichen haben, sondern nur die bis zum ersten '.'?

        Jain-
        Sofern kein .xxx folgt ja,

        Ähm, wenn kein '.' vorkommt, willst du also _auch_ alle Zeichen bis zum ersten '.' haben.

        ([^.]*) sollte es tun.

        Beschäftige dich mit <http://de.selfhtml.org/perl/sprache/regexpr.htm@title=regulären Ausdrücken>, dann gelingt dir auch die Auswahl von '.(x)htm(l)'.

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
      2. hi,

        Sofern kein .xxx folgt ja, nur wenn dem ein .xxx folgt, dann bis zu dem ersten _._ .
        Also eben beide Ausdrücke gleichzeitig.

        Also den ersten Teil immer, den zweiten optional.

        ^([^.]+(.[^.]+)?)$

        Beliebige Zeichen außer dem Punkt ein- oder mehrfach, anschließend optional nochmal einen Punkt gefolgt von beliebigen Zeichen außer dem Punkt ein- oder mehrfach.

        gruß,
        wahsaga

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

          ^([^.]+(.[^.]+)?)$

          Super, danke- das wird's sein. Ich habe das mit den äußeren Klammern nicht durchschaut.
          Noch eine Frage- wollte ich jetzt das Muster auf
          *.(x)html(l) einschränken, wäre dieser RegEx

          ^([^.]+(.[^?htm?]+)?)$

          dann richtig?

          Vielen Dank nochmal

          ^da Powl

  3. Hallo,
    Ich habe es geschafft:

      
    RewriteEngine on  
    RewriteBase /  
    RewriteRule ^(.*)\..?htm.?$  /index.php?page=$1 [L]  
    #setzt name in $1 für name.*htm*  
    RewriteCond %{SCRIPT_FILENAME} !-f  
    #wenn nicht auf eine Datei..  
    RewriteCond %{SCRIPT_FILENAME} !-d  
    #und nicht auf ein Verzeichnis verwiesen wird, dann:  
    RewriteRule ^(.*)$ /index.php?page=$1 [L]  
    #name in $1 speichern  
    
    

    somit wird bei
    home
    home.htm
    home.html
    home.xhtm und
    home xhtml
    /index.php?page=home aufgerufen.

    So funktioniert das nun. Vielen Dank für alle Inputs. Es ist 1fach viel zu heiss zum konzentrierten Nachdenken... (34°C)

    ^da Powl