Mit mod_rewrite pdf in Frameset betten
Rudolf Horbas
- webserver
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
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)
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
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
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