Tom: Rewrite Regeln kombinieren

Hello,

ich steh mal wieder auf dem Schlauch mit den Rewrite-Regeln für den Apache.

RewriteEngine on

1. Umleitung aller Requests, die _nicht_ auf die Haupt-Domain kommen auf diese

RewriteCond %{HTTP_HOST} !^www.example.org$
RewriteRule ^(.*)$ http://www.example.org/$1 [L,R=301]

2. Umleitung aller Requests, für die es keine harte Ressource gibt, auf die index.php

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule (.*) index.php/$1 [QSA]

Beide regeln für sich funktionieren wunschgemäß. Aber wie muss ich sie modifizieren, um sie kombinieren?

Also erst die falsche Domain auf die richtige umleiten und dann im Filesystem nachschauen, ob es für den resultierenden Request eine harte Ressource gibt, wenn nicht, dann die index.php benutzen.

Im Prinzip dar ja die zweite (interne) Umleitung gar nicht aufgerufen werden, wenn die erste (externe) Umleitung zutrifft.

Darf ich die also einfach so hintereinanderbaumeln?

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://restaurant-zur-kleinen-kapelle.de
  1. Beide regeln für sich funktionieren wunschgemäß. Aber wie muss ich sie modifizieren, um sie kombinieren?

    Das L-Flag ist die Antwort.

    Darf ich die also einfach so hintereinanderbaumeln?

    Ja, aber damit erzeugst du eben ggf. einen unnötigen Response und einen erneuten Request durch den Client.

    Wenn du willst, dass alle intern hintereinander abgearbeitet werden, musst du das L-Flag bei der ersten Regel entfernen.

    1. Hello,

      Beide regeln für sich funktionieren wunschgemäß. Aber wie muss ich sie modifizieren, um sie kombinieren?

      Das L-Flag ist die Antwort.

      Darf ich die also einfach so hintereinanderbaumeln?

      Ja, aber damit erzeugst du eben ggf. einen unnötigen Response und einen erneuten Request durch den Client.

      Wenn du willst, dass alle intern hintereinander abgearbeitet werden, musst du das L-Flag bei der ersten Regel entfernen.

      Das will ich ja gerade nicht.
      Das ist auch im Apache-Manual etwas dünn erklärt mit dem L-Flag.

      Nur wenn die erste Rewrite-Condition nicht zutrifft, sollen die folgenden noch geprüft werden.

      Das ist mir noch nicht klar, ob das jetzt so funktioniert. Ich kann es leider auch gerade nicht ausprobieren...

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://restaurant-zur-kleinen-kapelle.de
      1. Beide regeln für sich funktionieren wunschgemäß. Aber wie muss ich sie modifizieren, um sie kombinieren?

        Das L-Flag ist die Antwort.

        Darf ich die also einfach so hintereinanderbaumeln?

        Ja, aber damit erzeugst du eben ggf. einen unnötigen Response und einen erneuten Request durch den Client.

        Wenn du willst, dass alle intern hintereinander abgearbeitet werden, musst du das L-Flag bei der ersten Regel entfernen.

        Das will ich ja gerade nicht.
        Das ist auch im Apache-Manual etwas dünn erklärt mit dem L-Flag.

        Nur wenn die erste Rewrite-Condition nicht zutrifft, sollen die folgenden noch geprüft werden.

        Wie willst das Unterscheiden?

        1. wenn jemand nicht mit www.example.com kommt, soll er umgeleitet werden
        2. wenn jemand mit www.example.com kommt und kein Verzeichnis/File erwischt, soll er auf index.php geschossen werden (aber nur wenn er vorher nicht umgeleitet wird).

        Du hast aber keine unterscheidunsmöglichkeit zwischen einem Folgerequest aus 1) und einem direkten Request auf 2)

        Da musst du schon ein Unterscheidungsmerkmal anhängen.

        bzw. warum musst du es überhaupt Unterscheiden, ist das nicht egal?

        Das ist mir noch nicht klar, ob das jetzt so funktioniert.

        Ich glaube ich hab' dich immer noch nicht verstanden :D

        1. Hello,

          Wie willst das Unterscheiden?

          1. wenn jemand nicht mit www.example.com kommt, soll er umgeleitet werden
          2. wenn jemand mit www.example.com kommt und kein Verzeichnis/File erwischt, soll er auf index.php geschossen werden (aber nur wenn er vorher nicht umgeleitet wird).

          Jein. Wenn er extern umgeleitet wurde, sieht das ja anschließend intern so aus, als wäre es ein Request auf www.example.com

          Das funktioniert jetzt auch so. Ich habe es gerade ausprobieren können. Und so war es auch gewollt. Mir war jetzt nur nicht klar, was bei Nichtzutreffen der Rewrite-Condition (hier die 1.) passiert. Da werden also einfach alle Rules bis zur nächsten Rewrite-Condition überlesen.

          Jetzt bleibt nur noch die Frage, ob die externe Umleitung so günstig ist für den Traffic. Sollte da tatsächlich jemand einen Monsterpost auf eine gefangene URL (Alias-Url) senden, die _nicht_ www.example.com heißt, dann wird ja auch der ganze Monsterpost nochmal gesendet vom Client. Das macht dem dann bestimmt ganz viel Spaß. Aber das passiert dann ja zum Glück nur beim ersten Request. Beim zweiten steht der User ja schon in der richtigigen URL.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://restaurant-zur-kleinen-kapelle.de
          1. Hi,

            Jetzt bleibt nur noch die Frage, ob die externe Umleitung so günstig ist für den Traffic.

            Vermutlich günstiger, als wenn der Client verschiedene Domains nutzt – und dann identische externe Ressourcen (JS, CSS, Bilder) mal von dieser und mal von jener Domain separat lädt, obwohl sie identisch sind.

            Sollte da tatsächlich jemand einen Monsterpost auf eine gefangene URL (Alias-Url) senden, die _nicht_ www.example.com heißt, dann wird ja auch der ganze Monsterpost nochmal gesendet vom Client.

            Ein stinknormales Anfordern der Seite ist kein „Monsterpost“.
            Und bevor er dazu kommt, irgendwelche Formulare abzuschicken, muss er diese ja erst mal abrufen – wird also dabei schon umgeleitet.

            (Solltest du mit „Monsterpost“ tatsächlich einen Monster-POST-Request gemeint haben, wäre die Umleitung allerdings schlecht – denn dabei gehen dir POST-Daten verloren, da der Client ja als nächstes einen GET-Request ausführt, um der Umleitung zu folgen.)

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Hello,

              (Solltest du mit „Monsterpost“ tatsächlich einen Monster-POST-Request gemeint haben, wäre die Umleitung allerdings schlecht – denn dabei gehen dir POST-Daten verloren, da der Client ja als nächstes einen GET-Request ausführt, um der Umleitung zu folgen.)

              Danke für den Hinweis. Das muss ich nochmal genauer untersuchen :-|

              Es gibt den Fall, dass in einer fremden Webseite ein Formular untergebracht ist, das eine Action-URL auf eine der eingefangenen Seiten hat, die nicht die Stammdomain ist...

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://restaurant-zur-kleinen-kapelle.de