Rudolf Horbas: Mit mod_rewrite pdf in Frameset betten

Schöne gute Nacht,

ich zerbreche mir schon länger den Kopf über folgendem Problem:

Die pdfs aus unserem Server werden ständig direkt aus den Suchmaschinen aufgerufen, ohne dass sich jemand die Website anschaut. Darum wäre es schön, wenn beim direkten Aufruf einer pdf ein <frameset> gestartet wird, der die Datei einbettet.

Über mod_rewrite wird nun in der .htaccess die URL so umgeschrieben, dass der gewünschte Effekt entsteht.

Soweit die Theorie. Umgeschrieben wird die URL, aber ich lande in einer Endlosschleife mit verschachtelten Framesets, da ich es nicht schaffe, die RewriteCond so zu formulieren, dass im Falle der Referenzierung über den Frameset die Regel nicht greift.

Hier die aktuellen Zeilen aus der .htaccess (ich hatte auch schon andere):

RewriteCond  %{REQUEST_URI}  !^.*frame=ok.*$
RewriteRule  ^(.*.pdf)$  http://%{HTTP_HOST}/index.php?url=$1&frame=ok

Was mach ich falsch?

Ab in die Heia,

Rudi

  1. Hi Rudi,

    Soweit die Theorie. Umgeschrieben wird die URL, aber ich lande in
    einer Endlosschleife mit verschachtelten Framesets, da ich es nicht
    schaffe, die RewriteCond so zu formulieren, dass im Falle der
    Referenzierung über den Frameset die Regel nicht greift.

    <cite>Welcome to mod_rewrite, the Swiss Army Knife of URL manipulation!</cite>

    RewriteCond  %{REQUEST_URI}  !^.*frame=ok.*$
    RewriteRule  ^(.*.pdf)$  http://%{HTTP_HOST}/index.php?url=$1&frame=ok
    Was mach ich falsch?

    Das ist eigenlich nicht wirklich mein Thema ...

    ... aber hast Du schon mal mit den [flags] experimentiert?

    Lies mal
       http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteRule
    bis ganz zum Ende durch, die Rules haben als dritten (optionalen) Parameter noch einen Qualifier, mit dem man steuern kann, was nach einer Ersetzung passieren soll (weitermachen, aufhören, etc.)

    Der Qualifier "Last" klingt so, als ob er Deine Schleife vielleicht terminieren könnte.

    Viele Grüße
          Michael

    ``The great thing about mod_rewrite is it gives you all the configurability and flexibility  of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Sendmail.'' (Brian Behlendorf, Apache Group)

    `` Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. '' (Brian Moore, bem@news.cmc.net)

    1. Hallo Michael,

      <cite>Welcome to mod_rewrite, the Swiss Army Knife of URL manipulation!</cite>

      Jaaa, da kann man sich auch schneiden damit :-)

      RewriteCond  %{REQUEST_URI}  !^.*frame=ok.*$
      RewriteRule  ^(.*.pdf)$  http://%{HTTP_HOST}/index.php?url=$1&frame=ok
      Was mach ich falsch?
      [...]
      Lies mal
         http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteRule
      [...]
      Der Qualifier "Last" klingt so, als ob er Deine Schleife vielleicht terminieren könnte.

      Tut er leider nicht. Ich hab ja nur eine Rule in der .htaccess, und die wird eben immer wieder gnadenlos angewendet, wenn der Request aus dem Frameset kommt (Rahmen im Rahmen im Rahmen ... zum Glück funktioniert ESC).

      Ich lasse &frame=ok durch die Rule ja nur setzen, um die URI per regex ausfiltern zu können:

      -> RewriteCond  %{REQUEST_URI}  !^.*frame=ok.*$

      aber irgendwo haut das nicht hin (regex kann ich eigentlich einigermassen, aber in dieser Geschichte bin ich einfach totaler Anfänger und fische im Trüben.

      Wird wohl wieder eine lange Nacht ...

      Ciao,

      Rudi

      1. Hi Rudi,

        Ich hab ja nur eine Rule in der .htaccess,
        und die wird eben immer wieder gnadenlos
        angewendet, wenn der Request aus dem Frameset
        kommt (Rahmen im Rahmen im Rahmen ... zum Glück
        funktioniert ESC).

        aaach - jetzt habe ich erst verstanden, wo die Schleife liegt!

        Aber wenn das so ist, dann muß einfach Dein Frameset nur "unübersetzbare" URLs liefern.
        Vielleicht reicht es schon, wenn es einen "unnötigen" Query-String an das eingebettete Dokument dranhängt, den dann Deine (etwas modifizierter) RewriteCond (der dann explizit _kein_ '?' matchen darf) nicht mehr übersetzt?

        Viele Grüße
              Michael

        1. Moin!

          Aber wenn das so ist, dann muß einfach Dein Frameset nur "unübersetzbare" URLs liefern.
          Vielleicht reicht es schon, wenn es einen "unnötigen" Query-String an das eingebettete Dokument dranhängt, den dann Deine (etwas modifizierter) RewriteCond (der dann explizit _kein_ '?' matchen darf) nicht mehr übersetzt?

          Ich bin eigentlich der Meinung, daß es für dieses Problem keine Lösung gibt - jedenfalls keine, die a) immer funktioniert und b) mod_rewrite verwendet.

          Wenn ein Request das PDF abfordert: Woran kann man erkennen, daß dieser Request durch das eigene Frameset erfolgte? Garnicht! Naja, fast garnicht, denn der Referrer _könnte_ (!!! Drei Ausrufezeichen, denn mein Browser sendet derzeit keine Referrer) von der eigenen Domain herkommen und damit _andeuten_ (nicht beweisen), daß der Request von der eigenen Seite kommt.

          Lösung URL-Parameter? Auch nicht wirklich. Für eine kurze Zeit werden die extern beheimateten Links keinen Parameter haben, der interne Link aber schon - solange bis Suchmaschinen und andere Webmaster das herausgefunden haben. Und dann werden die externen Links auch einen Parameter kriegen und somit das PDF direkt abfordern.

          Was bleibt? Nicht viel.
          Man kann den Referrer auswerten: Wenn dieser _nicht_ die eigene Domain spezifiziert, dann redirectet man den Request auf das Frameset (welches dann bitteschön hoffentlich direkt zum PDF leitet). Wenn kein Referrer gesendet wird, oder einer der eigenen Domain, dann ist der Request vermutlich gültig und wird so durchgelassen. Ich würde von diesem ganzen Schwachfug dann verschont bleiben (dank des nicht gesendeten Referrers).

          Man kann auch versuchen, mit einem regelmäßig wechselnden URL-Parameter den Leuten vornewegzulaufen - dazu sollte der Parameter im Link dann aber auch dynamisch wechseln, sonst hat man regelmäßig wieder das Problem. Und ob's hilft, ist auch die Frage.

          - Sven Rautenberg