1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[mod_rewrite] Zwei Außnahmen in einer Regular Expression

Dieses Thema im Forum "Hosting & Webserver" wurde erstellt von NextOne, 7. Februar 2012.

  1. NextOne

    NextOne Grünschnabel

    Hallo liebe Community,

    ich suche seit Stunden um eine Lösung für ein Modrewrite-Problem. Leider gab Google noch eine Lösung

    Code (Text):
    1. RewriteEngine on
    2. RewriteRule ^ajax/(.+).php$ ajax.php?page=$1 [L,QSA]
    3. RewriteRule ^cron/(.+).php$ cron.php?page=$1 [L,QSA]
    4. RewriteRule ^([^ajax/]+)\.php$ index.php?page=$1 [L,QSA]
    Der oben genannte Code soll folgendes machen: Alle Anfrage die auf das Verzeichnis ajax/ kommen sollen auf ajax.php?page=$1 umgeleitet werden; alle Anfragen die zum Verzeichnis cron/ kommen sollen auf cron.php?page=$1 umgeleitet werden. Alle anderen Anfragen sollen über index.php?page=$1 geleitet werden (es soll auch z.B. http://domain.de/verzeichniss/datei.php möglich sein und dann auf index.php?page=verzeichniss/datei "umgeleitet" werden).

    Mein Lösungsansatz: Ich hätte nun die Regular Expression [^ajax/] um [^cron/] erweitert. Mein Problem ist nur, dass ich nicht weis die man zwei negative Regular Expression in Modrewrite verknüpft. Ich bin auch schon einmal auf [S=x] gestoßen, was meiner Erkenntnis nach die nächsten Abfragen überspringen soll, wenn die Abfrage, wo der "Paramente" angegeben ist, zutrifft. Leider hatte ich auch damit bislang keinen Erfolg.

    Des Weiteren wäre mir Ausschluss der beiden Verzeichnisse in der letzen Abfrage (erster Lösungsansatz) lieber, da ich damit besser mein noch in Planung befindlichen Ideen umsetzen könnte.

    Ich würde mich über eine Lösung sehr freuen


    Viele Grüße
    NextOne
  2. Vesquar

    Vesquar Grünschnabel

    Ich habe jetzt keinen Server laufen, bei dem ich das direkt ausprobieren könnte, aber im Prinzip kannst du versuchen den String zunächst auf ajax/ und cron/ zu matchen, um das Ergebnis dann zu negieren. Bei dem mod_rewrite gibt es sowas.

    Etwas in der Art hätte ich im Kopf:
    Code (Text):
    1. !.*(ajax/|cron/).*
    Code (Text):
    1. .*(ajax/|cron/).*
    Durchsucht den String nach ajax/ oder cron/ und das ! negiert dann das Ergebnis. Wenn es vorkommt gibt er false zurück, wenn es nicht drin ist true. Zumindest in der Theorie :p Getestet habe ich es jetzt nicht.
  3. NextOne

    NextOne Grünschnabel

    Hallo Vesquar,

    leider bringt dein Code nur Fehler. Diese Variante habe ich zuvor auch schon erfolglos aufprobiert...

    Hat sonst noch jemand 'ne Idee?


    Viele Grüße

    Next.One
  4. Vesquar

    Vesquar Grünschnabel

    Was mir gerade eingefallen ist: Willst du alles, was nicht auf ajax/ oder cron/ kommt auf die index.php weiterleiten? Dann könntest du ja einfach eine Regel machen, die genau dies tut und diese als letzte Zeile in die Datei packen:
    Code (Text):
    1. RewriteRule (.*)\.php$ index.php?page=$1 [L,QSA]
    Ansonsten hier meine weiteren Gedanken:

    Code (Text):
    1. RewriteEngine on
    2. RewriteRule ^ajax/?(.+)?\.php$ ajax.php?page=$1 [L,QSA]
    3. RewriteRule ^cron/?(.+)?\.php$ cron.php?page=$1 [L,QSA]
    4. RewriteRule !.*(ajax/|cron/).*\.php$ index.php?page=%{REQUEST_URI} [L,QSA]
    Das ist das brauchbarste, das ich mit kurzen Tests rausbekommen habe.
    Alle Anfragen auf ajax/ und cron/ werden auf die entsprechenden PHPs umgeleitet und alles sonstige geht an die index.php. Allerdings ist REQUEST_URI nicht das, was du haben willst. Mit REQUEST_URI wird der komplette Pfad der Datei inkl. Endung (.php) angegeben. Meinen Verständnis nach, kann man $1 nicht anwenden, da ja nicht gematched wird. Er kriegt in der letzten Zeile ja explizit kein Ergebnis, das durch ! im Wahrheitswert gedreht wird.

    Ansonsten würde mich interessieren, was für Fehler mit dem Code passieren. Evtl. habe ich auch nicht alle Fälle abgedeckt, die du haben willst.
  5. NextOne

    NextOne Grünschnabel

    Hallo Vesquar,

    ersten Danke für deine Hilfe. Der von dir oben genannte Code kann, wie du ja bereits gesagt hast, leider nur REQUEST_URI was wieder ein Konflikt gibt, wenn das Script in einem Unterortern liegt. Ich denke, dass (wenn nicht jemand noch einen genialen Einfall hat) ich den Code so nehme und "die Feinheiten" versuche mit PHP zu lösen.

    Nochmals vielen Dank!

    Next.One

Diese Seite empfehlen