Julian von Mendel: (Reguläre Ausdrücke) String darf nicht vorkommen

Hallo Welt,

ich möchte meinem Apache sagen, dass alle URIs bis auf die, die mit "resources" beginnen an das PHP-Skript index.php weitergeleitet werden. Also so:
/123 -> index.php
/hehe/abc -> index.php
/resources_123.jpg -> /resources_123.jpg
/resources/bild.png -> /resources/bild.png

Ich habe dafür diese primitive Regel in eine .htaccess geschrieben:

RewriteEngine on
RewriteRule ^(resources){0}(.*)$ /index.php [L]

Ich muss dazu sagen - ich hab keine Ahnung von regulären Ausdrücken. Das (resources){0} sollte meiner Meinung nach bedeuten, dass der String "resources" 0-mal vorkommen darf. Geht aber nicht: "500 Internal Server Error". Wie muss der reguläre Ausdruck richtig lauten?

Vielen Dank
Julian

  1. echo $begrüßung;

    Geht aber nicht: "500 Internal Server Error".

    So ein 500er Error ist ziemlich nichtssagend. Schau doch bitte im Error-Log nach, was genau nicht funktioniert hat.

    Das (resources){0} sollte meiner Meinung nach bedeuten, dass der String "resources" 0-mal vorkommen darf.

    Wenn etwas nicht vorkommen darf, schließt man es im Allgemeinen mit einer Negation aus.

    echo "$verabschiedung $name";

    1. Hi,

      Geht aber nicht: "500 Internal Server Error".

      So ein 500er Error ist ziemlich nichtssagend. Schau doch bitte im Error-Log nach, was genau nicht funktioniert hat.

      mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.

      Sieht aus als hätte ich eine Endlosschleife gebaut...

      Das (resources){0} sollte meiner Meinung nach bedeuten, dass der String "resources" 0-mal vorkommen darf.

      Wenn etwas nicht vorkommen darf, schließt man es im Allgemeinen mit einer Negation aus.

      RewriteRule ^!(resources)(.*)$ /index.php [L]
      So? Das führt dazu, dass gar nie zur index.php weitergeleitet wird.

      Schöne Grüße
      Julian

      1. echo $begrüßung;

        mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.

        Sieht aus als hätte ich eine Endlosschleife gebaut...

        Ja, und wenn du such noch ein RewriteLog (in der Server- oder VHost-Konfiguration) einschaltest, kannst du auch noch mitlesen, was mod_rewrite intern so alles treibt.

        RewriteRule ^!(resources)(.*)$ /index.php [L]
        So? Das führt dazu, dass gar nie zur index.php weitergeleitet wird.

        Am Suchmusteranfang soll eine Negation von irgendetwas ... nein, das geht nicht. Du willst doch, dass ein komplettes Muster nicht vorkommen darf. So sagt's das Apache-Manual: "In mod_rewrite, the NOT character ('!') is also available as a possible pattern prefix. This enables you to negate a pattern ...". Die entscheidende Stelle lautet pattern _prefix_.

        echo "$verabschiedung $name";

        1. Hi,

          mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.

          Sieht aus als hätte ich eine Endlosschleife gebaut...

          Ja, und wenn du such noch ein RewriteLog (in der Server- oder VHost-Konfiguration) einschaltest, kannst du auch noch mitlesen, was mod_rewrite intern so alles treibt.

          ich hab das grade ausprobiert - in der Zieldatei stand aber einfach nichts?!

          RewriteRule ^!(resources)(.*)$ /index.php [L]
          So? Das führt dazu, dass gar nie zur index.php weitergeleitet wird.

          Am Suchmusteranfang soll eine Negation von irgendetwas ... nein, das geht nicht. Du willst doch, dass ein komplettes Muster nicht vorkommen darf. So sagt's das Apache-Manual: "In mod_rewrite, the NOT character ('!') is also available as a possible pattern prefix. This enables you to negate a pattern ...". Die entscheidende Stelle lautet pattern _prefix_.

          RewriteRule !^resources(.*)$ /index.php [L]
          Jetzt ist das Ausrufezeichen ja ein Prefix. Aber weitergeleitet wird trotzdem nie.

          Schöne Grüße
          Julian

          1. echo $begrüßung;

            Ja, und wenn du such noch ein RewriteLog (in der Server- oder VHost-Konfiguration) einschaltest, kannst du auch noch mitlesen, was mod_rewrite intern so alles treibt.

            ich hab das grade ausprobiert - in der Zieldatei stand aber einfach nichts?!

            Das RewriteLogLevel sollte auch einen Wert bekommen. (Ich nehme immer 9.)

            RewriteRule !^resources(.*)$ /index.php [L]
            Jetzt ist das Ausrufezeichen ja ein Prefix. Aber weitergeleitet wird trotzdem nie.

            Befindet sich die index.php im Document-Root? Wenn ja, kann ich den Fehler nicht nachvollziehen und wäre auf eine Rewrite-Log-Ausgabe gespannt.

            echo "$verabschiedung $name";

            1. Hi,

              195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8427380/initial] (3) [per-dir /home/jvm/myhalw/] strip per-dir prefix: /home/jvm/myhalw/abc -> abc
              195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8427380/initial] (3) [per-dir /home/jvm/myhalw/] applying pattern '^resources(.*)$' to uri 'abc'
              195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8427380/initial] (2) [per-dir /home/jvm/myhalw/] rewrite abc -> /index.php

              soweit passt's ja.

              [Dieser Abschnitt wiederholt sich mehrfach]
              195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8427380/initial] (1) [per-dir /home/jvm/myhalw/] internal redirect with /index.php [INTERNAL REDIRECT]
              195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8426b80/initial/redir#1] (3) [per-dir /home/jvm/myhalw/] strip per-dir prefix: /home/jvm/myhalw/index.php -> index.php
              195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8426b80/initial/redir#1] (3) [per-dir /home/jvm/myhalw/] applying pattern '^resources(.*)$' to uri 'index.php'
              195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8426b80/initial/redir#1] (2) [per-dir /home/jvm/myhalw/] rewrite index.php -> /index.php
              [/wiederholung ende]

              Schöne Grüße
              Julian

              1. hi,

                [Dieser Abschnitt wiederholt sich mehrfach]
                195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8427380/initial] (1) [per-dir /home/jvm/myhalw/] internal redirect with /index.php [INTERNAL REDIRECT]

                Das sollte ja eigentlich schon gar nicht mehr passieren.

                Hilft es, noch das Flag NS an die RewriteRule anzuhängen?

                'nosubreq|NS' (used only if no internal sub-request)

                gruß,
                wahsaga

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

                  Hilft es, noch das Flag NS an die RewriteRule anzuhängen?

                  RewriteRule !^resources(.*)$ /index.php [NS,L]

                  führt zum gleichen Ergebnis.

                  Schöne Grüße
                  Julian

              2. echo $begrüßung;

                195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8427380/initial] (1) [per-dir /home/jvm/myhalw/] internal redirect with /index.php [INTERNAL REDIRECT]

                Die Endlosschleife entsteht meiner Meinung nach durch die absolute Pfadangabe /index.php. Damit verlässt du das aktuelle Verzeichnis, und kommst als neuer Request (interner Redirect) wieder rein, wodurch die Rewrite-Maschine von vorn anfängt. Mit einem lokalen Verweis (index.php - ohne führenden Slash) sollte das Problem nicht mehr auftreten. Es wird dann zwar immer noch ein interner Redirect angestoßen (nachdem das abc nach index.php umgeschrieben wurde), der erkennt aber, dass die Regel keine Änderung vornehmen konnte und beendet den Rewrite-Vorgang ordentlich.

                echo "$verabschiedung $name";

                1. Hi,

                  195.4.87.102 - - [09/Jul/2006:17:17:13 +0200] [subdomain.derjulian.net/sid#81be690][rid#8427380/initial] (1) [per-dir /home/jvm/myhalw/] internal redirect with /index.php [INTERNAL REDIRECT]

                  Die Endlosschleife entsteht meiner Meinung nach durch die absolute Pfadangabe /index.php. Damit verlässt du das aktuelle Verzeichnis, und kommst als neuer Request (interner Redirect) wieder rein, wodurch die Rewrite-Maschine von vorn anfängt. Mit einem lokalen Verweis (index.php - ohne führenden Slash) sollte das Problem nicht mehr auftreten. Es wird dann zwar immer noch ein interner Redirect angestoßen (nachdem das abc nach index.php umgeschrieben wurde), der erkennt aber, dass die Regel keine Änderung vornehmen konnte und beendet den Rewrite-Vorgang ordentlich.

                  du hast Recht. Danke!

                  Schöne Grüße
                  Julian

              3. Hi,

                Setze vor der RewriteRule noch die RewriteCond, daß die URL nicht /index.php sein darf.
                Denn auch /index.php erfüllt die Bedingung, daß es nicht mit resources anfängt ...

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                Schreinerei Waechter
                O o ostern ...
                Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.