levu: mod_rewrite

Hallo,

Ich habe totale Probleme mit mod_rewrite:

Ich hätte gerne eine URL nach dem folgenden Schema
/news/the-title-of-the-news ODER mit / am Ende (beides soll möglich sein => 1. Problem) (bustaben und bindestrich gemischt)
weitergeleitet auf cms.php?news_item=the-title-of-the-news ABER NUR, wenn der Ordner news nicht existiert (=> 2.Problem).

Zweite Regel:
/12345.php (zahlen und .php)
weitergeleitet auf
cms.php?id=12345 ABER NUR, wenn 12345.php nicht existiert (=2.problem).

Dritte Regel
/pagename.php (buchstaben und .php)
weitergeleitet auf
cms.php?page=pagename, wieder nur, wenn die entsprechende Datei nicht existiert, bisher wird immer cms.php auf cms.php?page=cms weitergeleitet.

Das größte Problem aber isst, dass ich immer nur #500 bekomme und nie eine detaillierte Fehlermeldung. Hoffe, ihr könnt mir einige Denkanstöße, Tipps & Tricks geben!

mfg, Flo

--
sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
  1. Hellihello

    Ich hätte gerne eine URL nach dem folgenden Schema
    /news/the-title-of-the-news ODER mit / am Ende (beides soll möglich sein => 1. Problem) (bustaben und bindestrich gemischt)

    "/?" könnte sein

    weitergeleitet auf cms.php?news_item=the-title-of-the-news

    ABER NUR, wenn der Ordner news nicht existiert (=> 2.Problem).
    RewriteCond ... -f

    Ansonsten, eins nach dem anderen und Code posten, mit dem du den 500er erzeugst. Mach erstmal was, was den Server nicht zum Streiken bringt, und hangel dich dann hoch...

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
    1. Hallo,

      /news/the-title-of-the-news ODER mit / am Ende (beides soll möglich sein => 1. Problem) (bustaben und bindestrich gemischt)
      "/?" könnte sein

      Da ist dann ein Problem mit dem Browser, weil der sich dann in einem anderen Verzeichniss "fühlt", kann man das außer mit absoluten Pfaden umgehen?

      ABER NUR, wenn der Ordner news nicht existiert (=> 2.Problem).
      RewriteCond ... -f

      Ich hatte es immer hinter RewriteRule gepackt :)

      Im Moment ist es folgende Zeile, die einen mehrfachen #500 erzeugt, der (laut Logfile) nach 10 inneren Fehlern gesendet wurde:

      RewriteRule (\w+).php$ /cms.php?page=$1

      mfg, Flo

      --
      sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
      1. /news/the-title-of-the-news ODER mit / am Ende (beides soll möglich sein => 1. Problem) (bustaben und bindestrich gemischt)
        "/?" könnte sein
        Da ist dann ein Problem mit dem Browser, weil der sich dann in einem anderen Verzeichniss "fühlt", kann man das außer mit absoluten Pfaden umgehen?

        Na ja, du kannst das natürlich mit gezielten Redirects wieder gerade biegen, wenn davon aber auch HTML-Links betroffen sind, würde ich doch davon abraten. Zumindest mit dem HTML-Element <base href...> könntest du das HTML-technisch richten.

        Im Moment ist es folgende Zeile, die einen mehrfachen #500 erzeugt, der (laut Logfile) nach 10 inneren Fehlern gesendet wurde:

        RewriteRule (\w+).php$ /cms.php?page=$1

        Ja, weil auch cms.php wieder auf die Regel passt. Entweder schließt du existierende Dateien oder bestimmte Pfade oder internal redirects, aus siehe cond. unten (letztere behebt nicht das Problem, wenn die existierende foo.php aufgerufen wird, diese landet dann auch auf /cms.php?page=foo). Deine RegEx ist auch nach links offen, d.h. foo/bar.php würde auch passen und auf /cms.php?page=bar landen. Planmäßig?

        #RewriteCond %{REQUEST_FILENAME} !-f
        #RewriteCond %{REQUEST_URI} !^/(foo|cms).php$
        #RewriteCond %{ENV:REDIRECT_STATUS} =""
        RewriteRule (\w+).php$ /cms.php?page=$1 [L]

        1. Hallo,

          /news/the-title-of-the-news ODER mit / am Ende (beides soll möglich sein => 1. Problem) (bustaben und bindestrich gemischt)
          "/?" könnte sein
          Da ist dann ein Problem mit dem Browser, weil der sich dann in einem anderen Verzeichniss "fühlt", kann man das außer mit absoluten Pfaden umgehen?

          Na ja, du kannst das natürlich mit gezielten Redirects wieder gerade biegen, wenn davon aber auch HTML-Links betroffen sind, würde ich doch davon abraten. Zumindest mit dem HTML-Element <base href...> könntest du das HTML-technisch richten.

          Geht das auch für CSS und JS?

          Im Moment ist es folgende Zeile, die einen mehrfachen #500 erzeugt, der (laut Logfile) nach 10 inneren Fehlern gesendet wurde:

          RewriteRule (\w+).php$ /cms.php?page=$1

          Ja, weil auch cms.php wieder auf die Regel passt. Entweder schließt du existierende Dateien oder bestimmte Pfade oder internal redirects, aus siehe cond. unten (letztere behebt nicht das Problem, wenn die existierende foo.php aufgerufen wird, diese landet dann auch auf /cms.php?page=foo). Deine RegEx ist auch nach links offen, d.h. foo/bar.php würde auch passen und auf /cms.php?page=bar landen. Planmäßig?

          #RewriteCond %{REQUEST_FILENAME} !-f
          #RewriteCond %{REQUEST_URI} !^/(foo|cms).php$
          #RewriteCond %{ENV:REDIRECT_STATUS} =""
          RewriteRule (\w+).php$ /cms.php?page=$1 [L]

          YMMD :) Danke, jetzt habe ich für den letzten Anwendungsfall noch folgende Regel:
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteRule ^(/?)([a-zA-Z-]+)$ /cms.php?news_item=$2 [L]
          Kann man da noch was verbessern?

          mfg, Flo

          --
          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
          1. Na ja, du kannst das natürlich mit gezielten Redirects wieder gerade biegen, wenn davon aber auch HTML-Links betroffen sind, würde ich doch davon abraten. Zumindest mit dem HTML-Element <base href...> könntest du das HTML-technisch richten.
            Geht das auch für CSS und JS?

            Ja, das betrifft alle relativ referenzierten Ressourcen, egal, ob jetzt in <img...> <script...> oder sonstwas.

            YMMD :) Danke, jetzt habe ich für den letzten Anwendungsfall noch folgende Regel:
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(/?)([a-zA-Z-]+)$ /cms.php?news_item=$2 [L]

            Das passt wohl so. Wenn du das nur im Verzichniskontext, also z.B. .htaccess-Dateien, verwendest, kannst du '(/?)' auch weglassen. Dort prüfst du immer gegen einen lokalen filepath (also von /var/www/foo wird das Prefix /var/www/ entfernt, sodass die RegEx auf foo angewendet wird). Aber ich glaube, du wolltest ehr, dass der Slash am Ende optional ist, also foo bzw. foo/. Dann müsstest du als RegEx  ^([a-zA-Z-]+)/?$  verwenden. Damit ist übrigens dann auch die Condition, die auf existierende Dateien prüft, (in der Regel) überflüssig: Deine RegEx schließt den Punkt aus, d.h. filepaths mit einer durch einen Punkt eingeleiteten Dateiendung würden gar nicht durch die RegEx erfasst werden.

            1. Hallo,

              Na ja, du kannst das natürlich mit gezielten Redirects wieder gerade biegen, wenn davon aber auch HTML-Links betroffen sind, würde ich doch davon abraten. Zumindest mit dem HTML-Element <base href...> könntest du das HTML-technisch richten.
              Geht das auch für CSS und JS?

              Ja, das betrifft alle relativ referenzierten Ressourcen, egal, ob jetzt in <img...> <script...> oder sonstwas.

              OK

              Das passt wohl so. Wenn du das nur im Verzichniskontext, also z.B. .htaccess-Dateien, verwendest, kannst du '(/?)' auch weglassen. Dort prüfst du immer gegen einen lokalen filepath (also von /var/www/foo wird das Prefix /var/www/ entfernt, sodass die RegEx auf foo angewendet wird).

              Gut! Da war ich mir nicht sicher xD

              Aber ich glaube, du wolltest ehr, dass der Slash am Ende optional ist,

              Zusätzlich noch :)

              Danke!

              mfg, Flo

              --
              sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|