Georg: mod-rewrite / Verständnisfrage

Hallo,

ich nutze derzeit folgende Rewrite-Rule:

  
RewriteEngine on  
Options FollowSymLinks  
ReWriteBase /  
RewriteRule ^([^/.]+)$ index.php?site=$1 [L]  

Hierdurch erreiche ich, das alles was hinter der Hauptdomain steht und nicht eine Datei ist als Variable (site) von der index.php verarbeitet wird (jedenfalls funktioniert das so nach tagelangem Ausprobieren ;-).
Nun stehe ich aber vor dem Problem, das ich jetzt zwingend eine URL (komplett, d.h. mit http://.. usw.) ebenfalls so filtern will, leider funktioniert das mit meinem Bastelversuch oben so gar nicht (wenn ich die ganzen Tuts richtig verstehe auch wegen den Slashes und weil die URL ja auch eventuell direkt die Datei enthalten könnte...
Meine Frage simpel ausgedrückt:
Wie muss ich die Rewriterule ergänzen/ändern, damit nicht nur:
http://domain.de/test zu http://domain.de/index.php?site=test
sondern auch
http://domain.de/http://domain2.de/test.php zu http://domain.de/index.php?site=http://domain2.de/test.php
wird ???

Ich komme da einfach nicht weiter und es wäre sehr gut, wenn sich hier jemand erbarmt und mir ein wenig unter die Arme greift...

Gruss
Georg

  1. Hi,

    RewriteEngine on
    Options FollowSymLinks
    ReWriteBase /
    RewriteRule ^([^/.]+)$ index.php?site=$1 [L]

    diese Rewrite Rule matcht alles, was mindestens ein Zeichen lang ist, aber keinen Slash und kein beliebiges Zeichen enthält. Soweit ich sehe, *kann* es keinen Ausdruck geben, der auf dieses Muster passt.

    Hierdurch erreiche ich, das alles was hinter der Hauptdomain steht und nicht eine Datei ist als Variable (site) von der index.php verarbeitet wird (jedenfalls funktioniert das so nach tagelangem Ausprobieren ;-).

    Dein Suchausdruck hat keinerlei Hinweis darauf, dass du existierende Dateien oder Verzeichnisse prüfst.

    Nun stehe ich aber vor dem Problem, das ich jetzt zwingend eine URL (komplett, d.h. mit http://.. usw.) ebenfalls so filtern will, leider funktioniert das mit meinem Bastelversuch oben so gar nicht ...

    Das *kann* auch nicht funktionieren, weil die komplette URL niemals beim Apachen ankommt. Die Rewrite Rule "sieht" immer nur den local part der URL, nicht aber den Domainnamen, das Protokoll oder den Port.

    So long,
     Martin

    --
    "Drogen machen gleichgültig."
     - "Na und? Mir doch egal."
  2. echo $begrüßung;

    Meine Frage simpel ausgedrückt:
    Wie muss ich die Rewriterule ergänzen/ändern, damit nicht nur:
    http://domain.example/test zu http://domain.example/index.php?site=test
    sondern auch
    http://domain.example/http://domain2.example/test.php zu http://domain.example/index.php?site=http://domain2.example/test.php
    wird ???

    Du möchtest also alles ^(.*)$ umschreiben, was keine Datei oder Verzeichnis ist. Dateien haben nicht als Alleinstellungsmerkmal einen Punkt im Namen. Auch in URLs kommen Punkte vor. Nach einem Punkt zu filtern ist deshalb keine gute Idee. Du musst eigentlich nur die RewriteRule um zwei RewriteCond ergänzen:

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

    Damit prüft der Apache im Dateisystem auf das Vorhandensein von Dateien und Verzeichnissen und bricht dann die Verarbeitung der RewriteRule ab.

    Bitte verwende für Beispiele die dafür vorgesehenen Domainnamen. Die von dir verwendeten sind registriert.

    echo "$verabschiedung $name";

  3. hallo,

    RewriteEngine on

    ok, das brauchst du, um mod_rewrite ansprechen zu können.

    Options FollowSymLinks

    Das hat mit mod_rewrite absolut nichts zu tun. Allerdings ist es etwas, was in einer .htaccess durchaus Sinn machen kann, sofern das Verzeichnis, in dem diese .htaccess liegt, tatsächlich auch Symlinks enthält.

    ReWriteBase /

    Hm. Kann man so angeben, muß man aber nicht unbedingt (ich weiß im Moment gar nicht, wie weit Apache case sensitive reagiert).

    RewriteRule ^([^/.]+)$ index.php?site=$1 [L]

    Ups.

    Hierdurch erreiche ich, das alles was hinter der Hauptdomain steht und nicht eine Datei ist als Variable (site) von der index.php verarbeitet wird (jedenfalls funktioniert das so nach tagelangem Ausprobieren ;-).

    Zweifelhafte Aussage, da hat Der Martin völlig recht.

    Nun stehe ich aber vor dem Problem, das ich jetzt zwingend eine URL (komplett, d.h. mit http://.. usw.) ebenfalls so filtern will

    Du solltest dieses "Problem" erläutern. "http://" ist zwar Bestandteil einer URL, was du aber bestenfalls übergeben kannst, ist etwas anderes. "http://" ist das benutzte Protokoll (es gibt ja außer HTTP noch weitere), und das _kannst_ du nicht in einer Variablen übergeben.

    leider funktioniert das mit meinem Bastelversuch oben so gar nicht

    Klar. Kann es auch nicht.

    (wenn ich die ganzen Tuts richtig verstehe auch wegen den Slashes und weil die URL ja auch eventuell direkt die Datei enthalten könnte...

    Da hast aber die "ganzen Tuts" nicht richtig gelesen.

    Meine Frage simpel ausgedrückt:
    Wie muss ich die Rewriterule ergänzen/ändern, damit nicht nur:
    http://domain.de/test zu http://domain.de/index.php?site=test
    sondern auch
    http://domain.de/http://domain2.de/test.php zu http://domain.de/index.php?site=http://domain2.de/test.php
    wird ?

    Gar nicht. Deine Voraussetzungen sind schlichtweg falsch.

    http://domain.de/test zu http://domain.de/index.php?site=test

    Das geht _ungefähr_ so:
       RewriteRule ^test$  index.php?test  [QSA]
    Voraussetzung ist, daß deine .htaccess in domain.de liegt - übrigens ein schlecht gewähler Bezeichner. Wenn man etwas ausprobieren möchte oder muß, nimmt man example.com, denn http://domain.de existiert natürlich und dürfte dir vermutlich nicht gehören.

    http://domain.de/http://domain2.de/test.php zu http://domain.de/index.php?site=http://domain2.de/test.php

    Das ist Unsinn. "http://domain.de/http://domain2.de/test.php" ist ungültig. Was du möchtest, ist "http://domain2.de/test.php" nach "http://domain.de/test.php" umzuleiten. Dazu muß in "domain2.de" eine andere .htaccess abgelegt werden, und in der schreibst du dann einfach:
       RedirectPermanent / http://domain.de/test.php
    Das ist alles.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|