frankx: schlauch bei rewriterule backreference

Hellihello

bei

RewriteEngine on
RewriteRule (.*) index.php?abc=def&url=$0 [L]

bringt mir
var_dump($_GET) :

array(2) {
  ["abc"]=>
  string(3) "def"
  ["url"]=>
  string(9) "index.php"
}

die URL aber ist:

http://localhost/blablabla/httpdocs/asdfasdf/asdfasdf/asdf.cde

Ich dachte mit [L] stopp ich die Ausführung und würde eigentlich den kompletten URL erwischen..?

Dank und Gruß,

frankx

--
tryin to multitain  - Globus = Planet != Welt
  1. echo $begrüßung;

    RewriteRule (.*) index.php?abc=def&url=$0 [L]
      ["url"]=>  string(9) "index.php"
    die URL aber ist:
    http://localhost/blablabla/httpdocs/asdfasdf/asdfasdf/asdf.cde
    Ich dachte mit [L] stopp ich die Ausführung und würde eigentlich den kompletten URL erwischen..?

    [L] verhindert die Ausführung weiterer Rules _für_diesem_Durchlauf_. Eine RewriteRule in einer Per-Verzeichnis-Konfigurationsdatei dreht nach dem Umschreiben eine neue Runde (erzeugt einen internen Redirect). Das passiert solange bis kein Umschreiben mehr stattfand. Eine neue Runde bedeutet auch, dass ein bereits erreichtes [L] uninteressant geworden ist. Es wird lediglich neu für die aktuelle Runde berücksichtigt, falls die Bedingung zutrifft.

    Beim "Rundendrehen" werden bei ungünstiger Regelnotation auch schon mal mehrere Umschreibungen vorgenommen, bis zufällig keine Regel mehr greift. Dann ist aber eventuell mehr Information verloren gegangen als beabsichtigt. Es kann aber auch zu Endlosschleifen führen, die der Apache aber nach einer konfigurierbaren Anzahl Durchläufen abbricht. Im Allgemeinen verhindert man mehrfache Ausführungen, indem man mittels RewriteCond die Regelausführung unterbindet, wenn die nachgefragte Datei (oder ein Verzeichnis) existiert.

    Was konkret abläuft kann man sich im RewriteLog anschauen. Allerdings muss man dazu den Apachen verwalten können. Das RewriteLog lässt sich nicht per Verzeichnis konfigurieren.

    RewriteRules beachten außerdem den Querystring nicht. Es gibt nur das Flag QSA, mit dem der Querystring angefügt wird. Das ist vermutlich nicht genau das was du willst. Der Querystring lässt sich aber mit einer RewriteCond ansprechen, und dann gibt es auch eine Backreferenz darauf (mit % beginnend).

    echo "$verabschiedung $name";

    1. Hellihello dedlfix,

      merci.

      echo $begrüßung;

      RewriteRule (.*) index.php?abc=def&url=$0 [L]
        ["url"]=>  string(9) "index.php"
      die URL aber ist:
      http://localhost/blablabla/httpdocs/asdfasdf/asdfasdf/asdf.cde
      Ich dachte mit [L] stopp ich die Ausführung und würde eigentlich den kompletten URL erwischen..?

      [L] verhindert die Ausführung weiterer Rules _für_diesem_Durchlauf_. Eine RewriteRule in einer Per-Verzeichnis-Konfigurationsdatei dreht nach dem Umschreiben eine neue Runde (erzeugt einen internen Redirect). Das passiert solange bis kein Umschreiben mehr stattfand. Eine neue Runde bedeutet auch, dass ein bereits erreichtes [L] uninteressant geworden ist. Es wird lediglich neu für die aktuelle Runde berücksichtigt, falls die Bedingung zutrifft.

      Mh, versteh ich nicht ganz, aber bedeutet scheints, dass

      .* index.php [L] öfter die Schleife durchläuft.

      Beim "Rundendrehen" werden bei ungünstiger Regelnotation auch schon mal mehrere Umschreibungen vorgenommen, bis zufällig keine Regel mehr greift. Dann ist aber eventuell mehr Information verloren gegangen als beabsichtigt. Es kann aber auch zu Endlosschleifen führen, die der Apache aber nach einer konfigurierbaren Anzahl Durchläufen abbricht. Im Allgemeinen verhindert man mehrfache Ausführungen, indem man mittels RewriteCond die Regelausführung unterbindet, wenn die nachgefragte Datei (oder ein Verzeichnis) existiert.

      Also

      RewriteCond "wenn die Datei nicht existiert, dann mach..." ?

      Und wenn dann nur eine index.php existiert (oder eine rewrite.php) und sonst keine, dann wird eben dann nicht mehr umgeschrieben, wenn auf diese bereits umgeleitet wurde. Hätte auch den Vorteil, dass eingebundene Bilder oder CSS-Files nicht weiter behellligt bzw. ungewollt umgeschrieben würden.

      Was konkret abläuft kann man sich im RewriteLog anschauen. Allerdings muss man dazu den Apachen verwalten können. Das RewriteLog lässt sich nicht per Verzeichnis konfigurieren.

      Naja, testen tu ich grad mit XAMPP unter WinXP.

      RewriteRules beachten außerdem den Querystring nicht. Es gibt nur das Flag QSA, mit dem der Querystring angefügt wird. Das ist vermutlich nicht genau das was du willst. Der Querystring lässt sich aber mit einer RewriteCond ansprechen, und dann gibt es auch eine Backreferenz darauf (mit % beginnend).

      Na, gut nochmal zur Erinnerung, aber auf den wollte ich u.U. verzichten bzw. war mir klar, dass der erstmal in der URL keine Rolle spielen würde.

      Eigentlich dachte ich, example.com/contact example.com/news example.com/imprint u.s.w. auf eine Datei umzuleiten und dort dann mit einem switch den content auszugeben.

      Alternative wäre halt  example.com?content=contact etc., was irgendwie simpler wäre, weil dann der switch direkt mit $_GET["content"] gebaut werden könnte. Irgendwie dachte ich halt, die o.g. Variante wäre "cooler".

      Dank und Gruß,

      frankx

      --
      tryin to multitain  - Globus = Planet != Welt
      1. Hellihello

        Beim "Rundendrehen" werden bei ungünstiger Regelnotation auch schon mal mehrere Umschreibungen vorgenommen, bis zufällig keine Regel mehr greift. Dann ist aber eventuell mehr Information verloren gegangen als beabsichtigt. Es kann aber auch zu Endlosschleifen führen, die der Apache aber nach einer konfigurierbaren Anzahl Durchläufen abbricht. Im Allgemeinen verhindert man mehrfache Ausführungen, indem man mittels RewriteCond die Regelausführung unterbindet, wenn die nachgefragte Datei (oder ein Verzeichnis) existiert.

        Also

        RewriteCond "wenn die Datei nicht existiert, dann mach..." ?

        Und wenn dann nur eine index.php existiert (oder eine rewrite.php) und sonst keine, dann wird eben dann nicht mehr umgeschrieben, wenn auf diese bereits umgeleitet wurde. Hätte auch den Vorteil, dass eingebundene Bilder oder CSS-Files nicht weiter behellligt bzw. ungewollt umgeschrieben würden.

        So, nun:

        RewriteEngine on
        rewritecond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) index.php?url=$0 [L]

        Soll tun: wenn die URL nicht auf eine existierende Datei zeigt, gib die index.php aus und übergib per $_GET["url"] den lokalen Teil der URL.

        Dank und Gruß,

        frankx

        --
        tryin to multitain  - Globus = Planet != Welt
      2. echo $begrüßung;

        Mh, versteh ich nicht ganz, aber bedeutet scheints, dass
        .* index.php [L] öfter die Schleife durchläuft.

        Der Apache ist mit dem Analysieren des Requests schon fast fertig, wenn er aus eine .htaccess trifft. Er hat bereits aus der URL einen Dateinamen ermittelt, denn sonst wüsste er ja auch nicht, welche .htaccess zuständig ist. Und nun kommt da Rewrite-Zeug drin vor, was auf die bereits ad acta gelegte URL zugreift und das bereits erledigte Dateinamenermitteln nochmal durchführen will. Das funktioniert nur, indem mod_rewrite nach seiner Umschreiberei einen internen Redirect auslöst. Und diesen wertet der Apache wieder von vorn an aus.

        Also
        RewriteCond "wenn die Datei nicht existiert, dann mach..." ?

        Und wenn dann nur eine index.php existiert (oder eine rewrite.php) und sonst keine, dann wird eben dann nicht mehr umgeschrieben, wenn auf diese bereits umgeleitet wurde. Hätte auch den Vorteil, dass eingebundene Bilder oder CSS-Files nicht weiter behellligt bzw. ungewollt umgeschrieben würden.

        Genauso ist es. Konkret sieht das so aus:

        RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d

        RewriteRules beachten außerdem den Querystring nicht.[...]
        Na, gut nochmal zur Erinnerung, aber auf den wollte ich u.U. verzichten bzw. war mir klar, dass der erstmal in der URL keine Rolle spielen würde.

        Gut, du hast mich erfolgreich irritiert, weil da was mit Querystring oben stand. Das hab ich wohl unterbewusst als Ausgangswert statt als Ergebnis behandelt.

        Eigentlich dachte ich, example.com/contact example.com/news example.com/imprint u.s.w. auf eine Datei umzuleiten und dort dann mit einem switch den content auszugeben.

        Alternative wäre halt  example.com?content=contact etc., was irgendwie simpler wäre, weil dann der switch direkt mit $_GET["content"] gebaut werden könnte. Irgendwie dachte ich halt, die o.g. Variante wäre "cooler".

        Der Möglichkeiten gibt es mehrere. Eine wäre

        RewriteCond %{REQUEST_FILENAME} !-d
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteRule ^(.*)$ index.php/$1 [L,QSA]

        und im Script PATH_INFO auswerten. Der Querystring bleibt erhalten und kann bei Bedarf anderweitig genutzt werden.

        Das Wichtigste sind die beiden RewriteCond-Zeilen. Dadurch wird beim ersten Redirect auf die index.php die Rule außer Kraft gesetzt und das Rewriten beendet. Zu deinem beobachteten Verhalten nehme ich an, dass durch die internen Redirects dein angehängter Querystring beim zweiten Durchlauf verworfen wurde, wie das halt bei Querystrings ohne QSA-Flag so üblich ist. abc=def wurde ja jedes mal erneut angehängt. Mit QSA sollte dein Querystring länger werden als dir lieb ist.

        Noch ein Detail, das ich schon wieder vergessen hatte: Wenn das Umschreibziel im selben Verzeichnis liegt (also nicht mit einer Pfadangabe beginnt), gibt es keine Endlosschleife plus Fehlermeldung. Dieser Fall wird erkannt und das Rewriten beendet.

        echo "$verabschiedung $name";

        1. Hellihello

          merci!

          und Dank und Gruß,

          frankx

          --
          tryin to multitain  - Globus = Planet != Welt