Raphael: Aktualisierung von Dateien auf einem Proxy-Server

Hallo

Ich habe auf einer Website für einen Kunden einen sogenannten Download-Bereich, wo man PDF's runterladen kann. Diese PDF's werden monatlich aktualisiert, d.h. die Files auf dem Webserver werden von mir einmal im Monat mit neuen Files mit gleichem Namen ausgetauscht.

Die Problematik:
Bei einem normalen Internetzugang alles kein Problem, es wird automatisch die aktuellste Datei angezeigt (spätestens dann, wenn man den Browser-Cache gelöscht hat).
Wenn jedoch im Netzwerk ein Proxy-Server vorgeschaltet ist, bringt's nichts, wenn der User lokal seien Cache löscht.

Frage:
Gibt's irgendwelche Tricks, wie ich den Proxy-Server zwingen kann, die Downloadfiles immer neu zu laden? Ich hab mal was gehört, dass man ein ? hinter die Dateienden setzten kann. Stimmt das? Wenn nein, was kann ich tun?

thanx for your help!

gruss
raphael

  1. hi!

    und dann bringt es nichts den proxy zu umgehen?:

    <meta http-equiv="pragma" content="no-cache">
    An Proxy-Agenten: Datei bitte nicht auf Proxy-Server speichern!

    ?

    :)

    gruß

    1. d.h. ich füge auf der seite mit den downloads einfach diesen meta-tag ein und das war's dann? oder wie soll ich das verstehen?

      gruss
      raphael

      1. Hi raphael,

        d.h. ich füge auf der seite mit den downloads einfach diesen
        meta-tag ein und das war's dann? oder wie soll ich das verstehen?

        Was Du (aus der Perspektive des Servers betrachtet!) erreichen willst,
        ist, zusammen mit der Datei eine Beschreibung auszuliefern, wie der
        Inhalt des "Pakets" zu behandeln sein soll.
        Das kann sich auf den Transportweg ("Hier oben", "Bitte nicht kippen

        • zerbrechlich") ebenso beziehen wie auf das Ziel des Weges ("Verfall-
          sdatum: Samstag in 8 Tagen"). Der Server schickt halt einen "Waschzettel"
          mit, und die verschiedenen Arten von Lesern fühlen sich von unterschied-
          lichen Aufschriften unterschiedlich heftig angesprochen.

        All das, was der Server neben (genauer gesagt: Vor) dem Inhalt des ange-
        forderten URL senden kann, sind diese Aufschriften - die HTTP-Header.

        Du hast nun mehrere Möglichkeiten:
        a) Du kennst Dich auf dem Server gut genug aus, um per Konfiguration
           direkt diese HTTP-Header zu beeinflussen.
        b) Du hast diese Möglichkeit nicht, hoffst aber, das irgendwie anders
           hinzukriegen.

        Klick mal auf diesen link hier:
             http://www.schroepl.net/cgi-bin/http_trace.pl?url=http%3A%2F%2Fselfaktuell.teamone.de%2F&method=GET&version=HTTP%2F1.1

        Das sendet der Teamone-Server alles, wenn jemand die Wurzelseite des
        SelfAktuell-Portals anfordert. Das sind nicht weniger als 24 HTTP-Header!
        (Ganz schön viel Lärm, wenn man es genau betrachtet. Und zwei identische
        Descriptions - ein netter Spaß ... übrigens: Genau 1111 bytes an HTTP-
        Headern! Stefan, gibst Du jetzt einen aus? Und mehr als 1 KB HTTP-Header,
        aber komprimierte Seiteninhalte ausliefern ... tststs ... ;-)

        Ein Teil dieser Header wird vom Webserver erzeugt, um das Ergebnis der
        Anforderung korrekt zu beschreiben. Ein anderer Teil jedoch - nämlich
        diejenigen Header, die mit "X-" anfangen - werden vom Webserver erzeugt,
        weil im Quelltext des HTML-Dokuments entsprechende <meta>-Tags stehen!
        Der Apache liest also das HTML-Dokument, versteht einen Teil davon und
        schreibt diesen Teil in den HTTP-Header hinein.

        Wenn dort nun etwas stünde, was den auf dem Übertragungsweg befindlichen
        Proxy-Server dazu bewegen würde, die übertragene HTML-Seite so zu behandeln,
        wie Du es willst, dann hättest Du Dein Problem damit wohl gelöst.

        Die <meta http-equiv> sind für genau diesen Zweck da - damit kannst Du
        HTTP-Header Deiner Wahl für ein HTML-Dokument mitsenden lassen.

        Vergleiche die oben genannte Ausgabe mit
             http://www.schroepl.net/cgi-bin/http_trace.pl?url=http%3A%2F%2Fwww.schroepl.net%2F&method=GET&version=HTTP%2F1.1,
        der Brückenseite meiner Homepage.

        Ich habe dort eine automatische Weiterleitung nach 5 Sekunden drin - und
        die manifestiert sich auch genau in dem HTTP-Header
             Refresh: 5;url=frameset.shtml?unten
        , den Du in der Ausgabe von "http_trace.pl" sehen kannst.

        Dies gilt aber nur für Dateitypen, welche der Webserver entsprechend lesen
        und verstehen kann.
        Betrifft Dein Problem beispielsweise den Download eines Zip-Archivs,
        dann wirst Du dort erhebliche Schwierigkeiten haben, <meta>-Tags hinein
        zu schreiben.
        In diesem Fall bleibt nur die andere Möglichkeit: Den Webserver so zu
        konfigurieren, daß er diejenigen Header sendet, die den Proxy anweisen,
        sich in Deinem Sinne zu verhalten.

        Und hoffen, daß der Proxy sich daran hält.
        Proxies sind immer eine Art Glücksspiel.
        Diejenigen, die sich an HTTP halten, sind die 'guten'.
        Das ist halt nicht anders als mit den Browsern.

        Viele Grüße
              Michael

        1. Hi Michael!

          http://www.schroepl.net/cgi-bin/http_trace.pl?url=http%3A%2F%2Fselfaktuell.teamone.de%2F&method=GET&version=HTTP%2F1.1
          Das sendet der Teamone-Server alles, wenn jemand die Wurzelseite des
          SelfAktuell-Portals anfordert. Das sind nicht weniger als 24 HTTP-Header!

          Das stimmt so nicht. Die meisten dieser Header sendet nicht der Server, sondern werden von LWP::UserAgent->request() nach Erhalt des Dokuments aus dessen Inhalt generiert. Das betrifft meines Wissens die (vermeintlichen) Header Client-Date, Title, Link, X-Meta-* (und Client-Peer?). Ich hab das jetzt zwar nicht ueberprueft (den Request per Telnet absetzen zeigt das), schliesse das aber aus meinen bisherigen Erfahrungen mit LWP.

          (Ganz schön viel Lärm, wenn man es genau betrachtet. Und zwei identische
          Descriptions - ein netter Spaß

          Weil da auch zwei im HTML der Seite stehen. ;-)

          So long

          1. Hi Calocybe,

            SelfAktuell-Portals anfordert. Das sind nicht weniger als 24 HTTP-Header!
            Das stimmt so nicht. Die meisten dieser Header sendet nicht der Server,
            sondern werden von LWP::UserAgent->request() nach Erhalt des Dokuments
            aus dessen Inhalt generiert.
            Das betrifft meines Wissens die (vermeintlichen) Header Client-Date,
            Title, Link, X-Meta-* (und Client-Peer?). Ich hab das jetzt zwar nicht
            ueberprueft (den Request per Telnet absetzen zeigt das), schliesse das
            aber aus meinen bisherigen Erfahrungen mit LWP.

            Oioioi ... vielen Dank für die Meldung.
            Da werde ich mit wohl mal den Quelltext ansehen müssen.

            Aber wie könnte ich diese "unechten" Header herausfiltern?

            Wenn ich LWP::UserAgent nehmen will (und das will ich eigentlich), dann
            muß ich ihm doch eigentlich glauben ... hmpf ...

            Nachdenkliche Grüße
                  Michael

            1. Hi Calocybe,

              Das stimmt so nicht. Die meisten dieser Header sendet nicht der Server,
              sondern werden von LWP::UserAgent->request() nach Erhalt des Dokuments
              aus dessen Inhalt generiert.
              Das betrifft meines Wissens die (vermeintlichen) Header Client-Date,
              Title, Link, X-Meta-* (und Client-Peer?).
              Oioioi ... vielen Dank für die Meldung.
              Da werde ich mit wohl mal den Quelltext ansehen müssen.

              ... etwas später:

              Einer der "Schuldigen" ist das Perl-Modul HTML::HeadParser, welches der
              Meinung ist, solche Header erzeugen zu wollen. In dessen Quelltext habe
              ich folgende generierte Header gefunden:

              • "Title"        (Inhalt von <title>...</title>)
              • "Content-Base" (Inhalt von <base href="...">)
              • "X-Meta-..."   (Inhalt von <meta http-equiv="...">)
              • "Isindex"      (Inhalt von <isindex ...>)
              • "Link"         (Inhalt von <link ...>)

              Und zu den "Client"-Headern sagt die LWP-Dokumentation:

              For all responses, the library will add a header called "Client-Date".

              This header will encode the time when the response was received by

              your application.  This format and semantics of the header is just

              like the server created "Date" header.  You can also encounter other

              "Client-XXX" headers.  They are all generated by the library

              internally and not something really passed on from the servers.

              Pfui Teufel. (War das wirklich notwendig, im Header herumzupfuschen?)

              Na gut - dann baue ich mir halt eine kleine Negativliste ein ...

              http://www.schroepl.net/cgi-bin/http_trace.pl?url=http%3A%2F%2Fselfaktuell.teamone.de%2F&method=GET&version=HTTP%2F1.0

              Besser so?

              Vielen Dank für die Informationen
                     Michael

    2. <meta http-equiv="pragma" content="no-cache">
      An Proxy-Agenten: Datei bitte nicht auf Proxy-Server speichern!

      Hm, das gilt ja nur für die HTML-Datei, es geht aber um die PDF-Files...

  2. hi,

    Ich hab mal was gehört, dass man ein ? hinter die Dateienden setzten kann. Stimmt das? Wenn nein, was kann ich tun?

    Du koenntest die URL des gezippten files per Javascript aufrufen, und dabei per "?" eine Zufalls-Query drannehaengen. Eventuell schafft das Abhilfe.

    Viel Erfolg  Joachim

  3. Moin!

    Die Problematik:
    Bei einem normalen Internetzugang alles kein Problem, es wird automatisch die aktuellste Datei angezeigt (spätestens dann, wenn man den Browser-Cache gelöscht hat).
    Wenn jedoch im Netzwerk ein Proxy-Server vorgeschaltet ist, bringt's nichts, wenn der User lokal seien Cache löscht.

    Ist das ein reales Problem, oder eher eine projizierte Ahnung?

    Normalerweise löschen User ihren Cache nämlich nicht. Also wäre auch Möglichkeit eins ein Problem.

    Andererseits liefert der Server, wenn er denn gefragt wird, eine Datei immer mit der Information aus, wann diese Datei erstellt wurde, und unter Umständen auch, wie lange die Datei gültig ist.

    Gibt es keine "gültig bis"-Angabe, dann nehmen Proxys in der Regel einen Standardwert an, der meist nicht größer ist, als ein Tag. Wochen- oder monatelanges Aufbewahren im Proxy-Cache ist sehr ungewöhnlich.

    Die Angabe "erstellt am" wird immer gesendet. Der Browser selbst wird beim erneuten Abrufen zuerst prüfen, ob die Datei noch gültig ist (wenn ja, dann wird er sie aus dem Plattencache ziehen). Andernfalls wird er die Datei beim Proxyserver anfordern. Dabei schickt er das Erstellungsdatum der Datei, die im Cache ist, mit. Der Proxy schaut in seinen Cache und liefert dann das Ergebnis aus dem Cache, wenn seine Kopie der Datei noch gültig ist und er eine neuere Datei als die des Browsers besitzt. Andernfalls liefert er "hat sich nicht geändert" zurück (HTTP-Statuscode "304 not modified" - in Proxy-Variante vermutlich etwas anders).

    Hat der Proxy nur noch eine ungültige Datei, dann wird er direkt den Server fragen: Ich will die Datei xy.pdf, meine ist vom 1.1.2002. Und der Server wird prüfen, ob er die Datei hat (wenn nein, gibts 404 not found), ob die Datei auf dem Server neuer ist (wenn nein, gibts 304 not modified), und sie gegebenenfalls ausliefern (mit Status 200 OK).

    Wenn der Browser keinen Proxy kennt, läuft das Spielchen direkt zwischen Browser und Server.

    Und wenn man im Netscape 4 bei gedrückter Shift-Taste auf "Reload" klickt, werden alle Anforderungsdaten, die eventuell ältere Versionen aus irgendwelchen Proxys und Caches hervorlocken könnten, unterdrückt und garantiert (naja, fast garantiert, wenn sich die Proxys daran halten) eine neue Version vom Server geholt.

    Frage:
    Gibt's irgendwelche Tricks, wie ich den Proxy-Server zwingen kann, die Downloadfiles immer neu zu laden? Ich hab mal was gehört, dass man ein ? hinter die Dateienden setzten kann. Stimmt das? Wenn nein, was kann ich tun?

    Du kannst erstmal schauen, ob deine Befürchtung überhaupt zutrifft. Und dann solltest du den Server konfigurieren, wenn die Befürchtung zutrifft.

    http://httpd.apache.org/docs/mod/mod_expires.html

    - Sven Rautenberg

    1. Und wenn man im Netscape 4 bei gedrückter Shift-Taste auf "Reload" klickt, werden alle Anforderungsdaten, die eventuell ältere Versionen aus irgendwelchen Proxys und Caches hervorlocken könnten, unterdrückt und garantiert (naja, fast garantiert, wenn sich die Proxys daran halten) eine neue Version vom Server geholt.

      imho cachet NN 4.x gar keine PDF-Dateien.

      Maja

  4. Hallo!

    Die Problematik:
    Bei einem normalen Internetzugang alles kein Problem, es wird automatisch die aktuellste Datei angezeigt (spätestens dann, wenn man den Browser-Cache gelöscht hat).

    Dazu muss man nicht erst den BrowserCache löschen, es wird immer nach der aktuellen Version gefragt. Mittels HTTP oder FTP Header welche einen Zeitstempel enthalten. Diese ganze Browsercachegeschichte kommt vor wenn die Daten nicht über HTTP oder FTP aufgerufen werden, ist sonst aber völlig unsinnig.

    Wenn jedoch im Netzwerk ein Proxy-Server vorgeschaltet ist, bringt's nichts, wenn der User lokal seien Cache löscht.

    Ich glaube das Problem liegt eher woanders.... und nicht beim Proxy.
    Wohlmöglich in der Art wie die Daten auf dem Server abgelegt werden.

    Hmm ne genauere Beschreibung der Problemsituation ist hilfreich.

  5. Hi!

    Gibt's irgendwelche Tricks, wie ich den Proxy-Server zwingen kann, die Downloadfiles immer neu zu laden? Ich hab mal was gehört, dass man ein ? hinter die Dateienden setzten kann. Stimmt das? Wenn nein, was kann ich tun?

    Falls es wirklich ganz normale Dateien sind, kannst Du ein ? und irgendwas beliebiges anhaengen (z.B. das aktuelle Datum). Der Proxy wird dann denken, es handelt sich um eine andere Ressource als die, die er gecachet hat. Aber auf seiten des Webservers wird dieser Query-String ignoriert und ganz normal die Datei ausgeliefert. Dazu muss aber die Seite mit dem neuen Link immer bis zum Benutzer durchkommen. Wenn der Proxy auch die Seite vorhaelt, auf der der jeweils zu aktualisierende Link steht - und das wird er wohl - muss man ihn da auch zur Weiterleitung der neuen Seite ueberreden. Und dafuer gab es ja schon genug Tips in diesem Thread.

    So long