kostenloser Webspace werbefrei: lima-city


mod_rewrite: Erneutes Matchen verhindern

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    nikic

    Kostenloser Webspace von nikic, auf Homepage erstellen warten

    nikic hat kostenlosen Webspace.

    Ich habe folgende.htaccess Datei:
    RewriteEngine on
    Options +FollowSymLinks
    
    # access file directly, without running prephp
    RewriteRule ^(.*\.php[345]?)@prephp!direct$ $1 [QSA,L]
    
    # prephp gets the variables
    # prefixed with prephp_
    # path: relative to this .htaccess
    RewriteRule ^(.*\.php[345]?)$ prephp/prephp.php?prephp_path=$1 [QSA,L]


    Ziel der zweiten Regel ist es, alle PHP-Dateien über einen Preprocessor laufen zu lassen.

    Ziel der ersten Regel ist es, die Möglichkeit zu bieten Dateien direkt aufzurufen.

    Das Problem bei der Sache: Das [L] zeigt hier keine Wirkung.

    Wenn ich
    http://localhost/prephp/prephp/config.php@prephp!direct
    aufrufe, dann leitet mod_rewrite erstmal intern auf
    prephp/config.php
    um und prüft dann natürlich nochmal alle Regeln, leitet also auf
    prephp/prephp.php?prephp_path=prephp/prephp.php

    Und das wollte ich eigentlich verhindern. Gibt es eine Möglichkeit über ein Flag oder irgendeine Cond Regeln auszuschließen, wenn es sich um eine Interne Umleitung handelt?

    Hier der RewriteLog (9):
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d35eb8/initial] (3) [perdir D:/xampp/htdocs/prephp/] strip per-dir prefix: D:/xampp/htdocs/prephp/prephp/config.php@prephp!direct -> prephp/config.php@prephp!direct
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d35eb8/initial] (3) [perdir D:/xampp/htdocs/prephp/] applying pattern '^(.*\.php[345]?)@prephp!direct$' to uri 'prephp/config.php@prephp!direct'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d35eb8/initial] (2) [perdir D:/xampp/htdocs/prephp/] rewrite 'prephp/config.php@prephp!direct' -> 'prephp/config.php'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d35eb8/initial] (3) [perdir D:/xampp/htdocs/prephp/] add per-dir prefix: prephp/config.php -> D:/xampp/htdocs/prephp/prephp/config.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d35eb8/initial] (2) [perdir D:/xampp/htdocs/prephp/] strip document_root prefix: D:/xampp/htdocs/prephp/prephp/config.php -> /prephp/prephp/config.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d35eb8/initial] (1) [perdir D:/xampp/htdocs/prephp/] internal redirect with /prephp/prephp/config.php [INTERNAL REDIRECT]
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (3) [perdir D:/xampp/htdocs/prephp/] strip per-dir prefix: D:/xampp/htdocs/prephp/prephp/config.php -> prephp/config.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (3) [perdir D:/xampp/htdocs/prephp/] applying pattern '^(.*\.php[345]?)@prephp!direct$' to uri 'prephp/config.php'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (3) [perdir D:/xampp/htdocs/prephp/] strip per-dir prefix: D:/xampp/htdocs/prephp/prephp/config.php -> prephp/config.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (3) [perdir D:/xampp/htdocs/prephp/] applying pattern '^(.*\.php[345]?)$' to uri 'prephp/config.php'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (2) [perdir D:/xampp/htdocs/prephp/] rewrite 'prephp/config.php' -> 'prephp/prephp.php?prephp_path=prephp/config.php'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (3) split uri=prephp/prephp.php?prephp_path=prephp/config.php -> uri=prephp/prephp.php, args=prephp_path=prephp/config.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (3) [perdir D:/xampp/htdocs/prephp/] add per-dir prefix: prephp/prephp.php -> D:/xampp/htdocs/prephp/prephp/prephp.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (2) [perdir D:/xampp/htdocs/prephp/] strip document_root prefix: D:/xampp/htdocs/prephp/prephp/prephp.php -> /prephp/prephp/prephp.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#3a57f58/initial/redir#1] (1) [perdir D:/xampp/htdocs/prephp/] internal redirect with /prephp/prephp/prephp.php [INTERNAL REDIRECT]
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (3) [perdir D:/xampp/htdocs/prephp/] strip per-dir prefix: D:/xampp/htdocs/prephp/prephp/prephp.php -> prephp/prephp.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (3) [perdir D:/xampp/htdocs/prephp/] applying pattern '^(.*\.php[345]?)@prephp!direct$' to uri 'prephp/prephp.php'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (3) [perdir D:/xampp/htdocs/prephp/] strip per-dir prefix: D:/xampp/htdocs/prephp/prephp/prephp.php -> prephp/prephp.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (3) [perdir D:/xampp/htdocs/prephp/] applying pattern '^(.*\.php[345]?)$' to uri 'prephp/prephp.php'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (2) [perdir D:/xampp/htdocs/prephp/] rewrite 'prephp/prephp.php' -> 'prephp/prephp.php?prephp_path=prephp/prephp.php'
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (3) split uri=prephp/prephp.php?prephp_path=prephp/prephp.php -> uri=prephp/prephp.php, args=prephp_path=prephp/prephp.php&prephp_path=prephp/config.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (3) [perdir D:/xampp/htdocs/prephp/] add per-dir prefix: prephp/prephp.php -> D:/xampp/htdocs/prephp/prephp/prephp.php
    ::1 - - [05/Mrz/2010:13:10:20 +0100] [localhost/sid#143d160][rid#2d34ba8/initial/redir#2] (1) [perdir D:/xampp/htdocs/prephp/] initial URL equal rewritten URL: D:/xampp/htdocs/prephp/prephp/prephp.php [IGNORING REWRITE]
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hi,
    nikic schrieb:
    Das Problem bei der Sache: Das [L] zeigt hier keine Wirkung.

    nun ja, wenn ich mal beim Erfinder nachlese, dann ist das schon so ok: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteflags
    Der interne redirekt gilt als erneuter request und deshalb werden alle Regeln wieder von vorne abgearbeitet. Das Flag bewrikt aber, dass nicht auch noch die zweite Regel angewendet wird, wenn die erste schon passt, so wie es in deinem Beispiel der Fall ist.
    Als Lösung würde ich vorschlagen einen Parameter mitzugeben, der dann in der prephp.php ausgewertet wird, also z.B. config.php?prep="no". Dann kannst du dir die erste Regel schenken.

    Ich weiß nicht ob du gesehen hast, dass du eine schönen Schleife gebaut hast. Irgendwann gibt mod_rerwrite scheinbar auf, aber die feiner Art ist das nicht. :).
    Wenn die zweite Regel zutrifft wird umgeleitet und dann trifft die zweite Regel wieder zu, da es sich ja wieder um ein .php file handelt (Die Argumente nach dem ? werden offenbar nicht zur url gezählt, wie man in deinem Log sehen kann).
    Ich habe eine Zeit lang nachgedacht wie das zu umgehen wäre. Ohne es wirklich exakt durchgespielt oder gar getestet zu haben, würde ich mal versuchen eine erste Regel durch die Rewrite Condition
    RewriteCond %{REQUEST_URI}. !.*prephp.php.*
    zu ersetzen.

    Ich hoffe das funktioniert so oder hilft dir zumindest auf einen guten Weg :).

    Gruß
    Manni
  4. Autor dieses Themas

    nikic

    Kostenloser Webspace von nikic, auf Homepage erstellen warten

    nikic hat kostenlosen Webspace.

    bandi999 schrieb:
    Hi,
    nun ja, wenn ich mal beim Erfinder nachlese, dann ist das schon so ok: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteflags
    Der interne redirekt gilt als erneuter request und deshalb werden alle Regeln wieder von vorne abgearbeitet. Das Flag bewrikt aber, dass nicht auch noch die zweite Regel angewendet wird, wenn die erste schon passt, so wie es in deinem Beispiel der Fall ist.

    Ja, warum es nicht funktioniert ist mir schon klar, mein Problem ist wie ich das behebe.
    Als Lösung würde ich vorschlagen einen Parameter mitzugeben, der dann in der prephp.php ausgewertet wird, also z.B. config.php?prep="no". Dann kannst du dir die erste Regel schenken.

    Das würde nicht ganz das gewünschte Ergebnis sein. Mein Ziel ist es den Request direkt an den Server zu leiten. Eine der Anwendungen dafür wäre nämlich die Fehlerseite abzufangen, die Apache normalerweise werfen würde. Das kann ich aber nicht, wenn ich alles über prephp.php leite. Oder gibt es irgendeine andere Möglichkeit an die Apache-Fehlerseiten-Konfiguration zu kommen?

    Ich weiß nicht ob du gesehen hast, dass du eine schönen Schleife gebaut hast. Irgendwann gibt mod_rerwrite scheinbar auf, aber die feiner Art ist das nicht. :).
    Wenn die zweite Regel zutrifft wird umgeleitet und dann trifft die zweite Regel wieder zu, da es sich ja wieder um ein .php file handelt (Die Argumente nach dem ? werden offenbar nicht zur url gezählt, wie man in deinem Log sehen kann).
    Ich habe eine Zeit lang nachgedacht wie das zu umgehen wäre. Ohne es wirklich exakt durchgespielt oder gar getestet zu haben, würde ich mal versuchen eine erste Regel durch die Rewrite Condition
    RewriteCond %{REQUEST_URI}. !.*prephp.php.*
    zu ersetzen.

    Oh Danke. Werde ich beheben ;)
  5. Hi,
    nikic schrieb:
    Ja, warum es nicht funktioniert ist mir schon klar, mein Problem ist wie ich das behebe.
    hmm, ich wollte dir nicht zu nahe treten. Allerdings ließ deine Aussage
    Das Problem bei der Sache: Das [L] zeigt hier keine Wirkung.
    die Vermutung zu, dass nicht alles ganz klar ist, denn das [L] macht genau das was es soll.
    Das würde nicht ganz das gewünschte Ergebnis sein. Mein Ziel ist es den Request direkt an den Server zu leiten. Eine der Anwendungen dafür wäre nämlich die Fehlerseite abzufangen, die Apache normalerweise werfen würde. Das kann ich aber nicht, wenn ich alles über prephp.php leite.
    Das ist mir jetzt irgendwie nicht klar. Die Idee in deinem code war doch, dass Seiten die mit @prephp!nodirect enden direkt aufgerufen werden, alles andere was mit .php[345] endet wird auf die prephp umgeleitet. Wenn du nun die direkt aufzurufenden Seiten mit ?prephp=no kennzeichnest, kannst du doch in der prephp.php prüfen ob die direkte Ausgabe erfolgen soll oder ob vorher z.B. auf Fehlerseiten geprüft werden soll.
    if(isset($_GET['prephp'] )&& $_GET['prephp']="no") 
    {$url= rootdir . $_GET['prephp_path'] 
    echo $url 
    } 
    else //Fehlerseitenerkennung

    Oder gibt es irgendeine andere Möglichkeit an die Apache-Fehlerseiten-Konfiguration zu kommen?

    Eine bekannte Suchmaschine liefert z.B. http://forum.fachinformatiker.de/rootserver-vserver-webspace/95079-apache-404-eigene-errorseite.html oder http://www.netconcept24.de/nuetzliches/tutorials/tutorial2.php wonach eine Konfiguration sowohl in der httpd.conf als auch in einer .htaccess möglich sein sollte.

    Ich hoffe diesmal habe ich besser verstanden um was es dir geht.
    Allerdings gilt auch diesmal: Alles ungetestet!

    Gruß
    Manni
  6. Autor dieses Themas

    nikic

    Kostenloser Webspace von nikic, auf Homepage erstellen warten

    nikic hat kostenlosen Webspace.

    bandi999 schrieb:
    Das würde nicht ganz das gewünschte Ergebnis sein. Mein Ziel ist es den Request direkt an den Server zu leiten. Eine der Anwendungen dafür wäre nämlich die Fehlerseite abzufangen, die Apache normalerweise werfen würde. Das kann ich aber nicht, wenn ich alles über prephp.php leite.
    Das ist mir jetzt irgendwie nicht klar. Die Idee in deinem code war doch, dass Seiten die mit @prephp!nodirect enden direkt aufgerufen werden, alles andere was mit .php[345] endet wird auf die prephp umgeleitet. Wenn du nun die direkt aufzurufenden Seiten mit ?prephp=no kennzeichnest, kannst du doch in der prephp.php prüfen ob die direkte Ausgabe erfolgen soll oder ob vorher z.B. auf Fehlerseiten geprüft werden soll.
    if(isset($_GET['prephp'] )&& $_GET['prephp']="no") 
    {$url= rootdir . $_GET['prephp_path'] 
    echo $url 
    } 
    else //Fehlerseitenerkennung

    Ich erkläre mal kurz, was ich will:
    Eine PHP-Datei wird aufgerufen. Dann jage ich sie durch einen PHP-Preprocessor. Natürlich kann ich das nur machen, wenn es die aufgerufene Datei wirklich gibt, also prüfe ich dies vorher mit file_exists. Wenn die Datei nun nicht existiert, dann möchte ich einen 404-Error spucken. Klar, einen 404 Header zurückgeben und eine Fehlerseite anzeigen ist kein Problem. Was ich aber will, ist, die Fehlerseite anzuzeigen, die Apache werfen würde. Da ich bis jetzt noch keine Möglichkeit gefunden habe mit PHP an die 404-Fehlerseite zu gelangen, möchte ich einfach den "Original"-Request senden, um Apaches originale Fehlermeldung ausgeben zu können.
    Ich hoffe du verstehst jetzt, warum es in diesem Fall wenig bringt prephp einen no-Parameter zu übergeben, ich stünde immer noch vor dem selben Problem.
  7. Hi,
    nikic schrieb:
    Da ich bis jetzt noch keine Möglichkeit gefunden habe mit PHP an die 404-Fehlerseite zu gelangen, möchte ich einfach den "Original"-Request senden, um Apaches originale Fehlermeldung ausgeben zu können.
    Ich hoffe du verstehst jetzt, warum es in diesem Fall wenig bringt prephp einen no-Parameter zu übergeben, ich stünde immer noch vor dem selben Problem.
    Also um ehrlich zu sein verstehe ich den Teil
    RewriteRule ^(.*\.php[345]?)@prephp!direct$ $1 [QSA,L]
    aus dem Ausgangpost jetzt noch weniger als zuvor. Ich schätze mal das ist auch nicht mehr relevant. Zu dem für mich nun neuen Problem aus PHP an die Fehlerseite zu kommen kannst du
    $url = rootdir . $GET_['prephp_path'];
    header("Location: $url");
    benutzen. Evtl. geht das auch mit relativem Pfad, ansonsten mußt du halt schaun wie du an das rootdir kommst. Dann hast du sozusagen eine Umleitung aus PHP heraus. Klappt allerdings nur, solange die Datei noch keine Ausgaben gemacht hat. Nach den bisher beschriebenen Anforderungen sollte dies aber kein Problem sein. Das war übrigens auch schon die Idee aus dem letzten Post von mir, wobei ich es mir mit echo $url etwas zu einfach gemacht habe ;). Die Sache mit der Header Location habe ich getestet und es funzt.
    Bin ja gespannt, ob ich mich nun näher an des Pudels Kern heran getastet habe ;).
    Gruß
    Manni
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!