ruben: mod_rewrite Anfrage auf tatsächliche Datei

Hallo!

Ich mache grad meine ersten Schritte in mod_rewrite und stolpere über folgendes Problem:
Ich möchte meine URLs in einer bestimmten Form sehen und zwar in der Form:
Sprache/Seite/Nutzer/
RewriteRule ^([a-z]+)/([a-z]+)/([a-zA-Z0-9]+)$ /$2.php?sprache=$1&nutzer=$3 [L,QSA]

Das ist die (vielleicht zu simple) Regel, die ich dafür benutze.
Soweit so klar.

Ich will aber nicht, dass man die Seiten über ihre eigentlichen URLs erreichen kann (es ist ja immer die Rede vom Verbergen der Programmiersprache, aber mich interessiert inzwischen auch einfach nur, ob es möglich ist).
Nun stehe ich vor dem Problem, dass:
1. Die Originalseite wird aufgerufen.
2. Es ist ein leichtes, den Request "abzufangen" und an die erwünschte Form weiterzugeben.
3. Die erwünschte Form wird aufgerufen.
4. Es ist ein leichtes, den Request "abzufangen" und an die Originalseite weiterzugeben.
Wir wären wieder bei 1.

Ist es möglich, diesen Teufelskreis zu brechen?

Nun bin ich sicher nicht der Erste, der sich das fragt, aber es ist schwierig, diese Fragestellung so zu formulieren, dass man relevante Suchergebnisse kriegt. Ich hoffe, das erklärt ausreichend, warum ich eine vermutlich bereits gestellte Frage noch einmal stelle.

Vielen Dank,
Ruben

  1. RewriteRule ^([a-z]+)/([a-z]+)/([a-zA-Z0-9]+)$ /$2.php?sprache=$1&nutzer=$3 [L,QSA]

    Ich will aber nicht, dass man die Seiten über ihre eigentlichen URLs erreichen kann

    1. Woher soll ein Besucher wissen, was du innerhalb deines Servers zusammenbastelst?
    2. Unabhängig von der hellseherischen Hürde aus 1) könntest Du im Skript die angefragte URL überprüfen; PHP gibt sie IIRC in $_SERVER["REQUEST_URI"] preis, nach mod_rewrite-Behandlung eventuell auch $_SERVER["REDIRECT_URI"].

    1. Die Originalseite wird aufgerufen.
    2. Es ist ein leichtes, den Request "abzufangen" und an die erwünschte Form weiterzugeben.
    3. Die erwünschte Form wird aufgerufen.
    4. Es ist ein leichtes, den Request "abzufangen" und an die Originalseite weiterzugeben.
      Wir wären wieder bei 1.

    Diese Darstellung ist mir etwas undurchsichtig. Für wen ist es "ein Leichtes", die Anfrage abzufangen? Die Formulierung erweckt den Eindruck, du würdest von einem Außenstehenden berichten. Und von was für einer Form redest du?

      1. Woher soll ein Besucher wissen, was du innerhalb deines Servers zusammenbastelst?

      Von import/nutzer
      auf import.php?nutzer=nutzer zu schließen, erfordert wenig Geschick. Irgendeine URL zu raten (zB. index.php) noch weniger.

      1. Unabhängig von der hellseherischen Hürde aus 1) könntest Du im Skript die angefragte URL überprüfen; PHP gibt sie IIRC in $_SERVER["REQUEST_URI"] preis, nach mod_rewrite-Behandlung eventuell auch $_SERVER["REDIRECT_URI"].

      Ich möchte es, wenn überhaupt, ausschließlich mit mod_rewrite realisieren (alles andere wäre auch übertriebener Aufwand für ein – wie du richtig zeigtest – seltenes Problem.

      Diese Darstellung ist mir etwas undurchsichtig. Für wen ist es "ein Leichtes", die Anfrage abzufangen? Die Formulierung erweckt den Eindruck, du würdest von einem Außenstehenden berichten. Und von was für einer Form redest du?

      1. Aufruf von index.php
      2. Mit [R] flag auf /index umleiten.
      3. Aufruf von /index
      4. Ohne [R] flag auf index.php umleiten.

      Besser so?
      Achja: Das verbirgt nicht die Server-Architektur. Es soll nur illustrieren, dass man einen Teufelskreis erstellt. Was ich eher im Sinn hatte war etwas à la:

      1. Aufruf von index.php
      2. 404 dank mod_rewrite
      andere Schiene:
      1. Aufruf von /index
      2. Ohne [R] flag auf index.php umleiten.

      Das birgt aber dasselbe Problem.

      Ich suche also etwas à la:
      "Wenn der Nutzer nicht über die verbergende URL /index hierhergekommen ist, dann gib einen 404 aus."

      Das geht vielleicht mit einer RewriteCond? Kann ich mit der erkennen, welche Umleitung vorgenommen wurde?

        1. Woher soll ein Besucher wissen, was du innerhalb deines Servers zusammenbastelst?
          Von import/nutzer
          auf import.php?nutzer=nutzer zu schließen, erfordert wenig Geschick.

        IMHO setzt du da zu viel freie Zeit voraus.

        "Wenn der Nutzer nicht über die verbergende URL /index hierhergekommen ist, dann gib einen 404 aus."

        RewriteEngine on
        RewriteBase /

        RewriteRule bla index.php?bla [L]

        RewriteCond %{THE_REQUEST} index.php
        RewriteRule index.php - [F]

        In THE_REQUEST ist die komplette und vor allen Dingen unveränderte erste Zeile der Anfrage des Browsers enthalten. RewriteCond kennt zwar auch die eigentlich etwas treffendere Variable REQUEST_URI, deren Inhalt wird aber durch mod_rewrite beeinflusst, ist also im erwünschten Fall zuerst "bla" und beim durch RewriteRule 1 ausgelösten zweiten Durchlauf "index.php?bla".

        Einen 404 kannst du mit mod_rewrite nicht ausgeben, zur Auswahl an externen Meldungen stehen nur 403 (Zugriff verboten, [F]), 410 (Entschwunden, [G]) oder die Weiterleitung mit R. Du könntest jedoch ein PHP-Skript erstellen, das seinerseits per 'header("HTTP/1.0 404");' den gewünschten Fehler ausgibt, und dieses mittels 'RewriteRule index.php fehler404.php [L]' (statt [F] in RewriteRule 2) ansteuern.

        1. IMHO setzt du da zu viel freie Zeit voraus.

          Das üppigste Gut unter Script-Kiddies. Aber ausprobieren, ob es nun:
          1. index.html
          2. index.php
          3. index.asp
          4. index.jsp
          erfordert kaum Zeit.

          "Wenn der Nutzer nicht über die verbergende URL /index hierhergekommen ist, dann gib einen 404 aus."

          RewriteCond %{THE_REQUEST} index.php
          RewriteRule index.php - [F]

          In THE_REQUEST ist die komplette und vor allen Dingen unveränderte erste Zeile der Anfrage des Browsers enthalten. RewriteCond kennt zwar auch die eigentlich etwas treffendere Variable REQUEST_URI, deren Inhalt wird aber durch mod_rewrite beeinflusst, ist also im erwünschten Fall zuerst "bla" und beim durch RewriteRule 1 ausgelösten zweiten Durchlauf "index.php?bla".

          Danke vielmals! Genau, ob diese Funktionalität gegeben ist, wusste ich nicht! Herzlichen Dank!

          Einen 404 kannst du mit mod_rewrite nicht ausgeben, zur Auswahl an externen Meldungen stehen nur 403 (Zugriff verboten, [F]), 410 (Entschwunden, [G]) oder die Weiterleitung mit R. Du könntest jedoch ein PHP-Skript erstellen, das seinerseits per 'header("HTTP/1.0 404");' den gewünschten Fehler ausgibt, und dieses mittels 'RewriteRule index.php fehler404.php [L]' (statt [F] in RewriteRule 2) ansteuern.

          Ich überleg mir was. Ich mach mir ja nicht wirklich Sorgen, wollte nur wissen, ob es generell möglich ist.