it-swarm.com.de

Verhindert, dass der Browser eine Textdatei zwischenspeichert

Ich habe eine Webanwendung, die auf einem Apache-Server im Intranet einer Organisation ausgeführt wird. In dieser Webanwendung gibt es eine JavaScript-Funktion, die eine bestimmte Textdatei über JavaScript lädt

xhttp = new XMLHttpRequest();
var data = xhttp.open("GET", "data.txt", false);

Während der Nutzung der Web-App kann diese Textdatei ihren Inhalt verändern. Diese Änderungen müssen in der Web-App berücksichtigt werden, d. H. Die Textdatei muss neu geladen werden und darf nicht aus dem Browser-Cache gelesen werden. Der Browser (insbesondere Chromium) speichert die Textdatei jedoch im Cache. Was kann man tun, wenn der Browser die Textdatei immer vom Server anfordert und sie niemals zwischenspeichert?

Kann dies immer nur mit HTML/JavaScript (oder Perl) nachgeladen werden?

Ich habe keinen Zugriff auf die Apache-Serverkonfiguration. Die App verwendet viele Perl-Skripte, um die Webseite zusammenzustellen, mit der ich nicht vertraut bin, aber auf die ich Zugriff habe.

4
nutgoodinuff

Sie haben zwei Ansätze für dieses Problem.

Die saubere Methode besteht darin, die für GET data.txt zurückgegebenen Header festzulegen, um zu verhindern, dass der Browser (oder Proxy) die Antwort im Cache speichert. Bei Verwendung von Apache kann dies normalerweise durch Hinzufügen einiger Zeilen in einer .htaccess-Datei erfolgen. Wenn es sich bei dieser Datei um eine statische Datei handelt, ist dies die einzige Möglichkeit, die Header zu steuern. From https://stackoverflow.com/questions/11532636/prevent-http-file-caching-in-Apache-httpd-mamp

<filesMatch "data\.txt$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

Wenn GET data.txt von einem Skript (Perl, PHP, Java usw.) behandelt wird, kann das Setzen dieser Header vom Skript selbst aus erfolgen (muss ausgeführt werden, bevor Inhalte gesendet werden). Hier ein Beispiel in PHP

<?php
header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate"); // HTTP/1.1
header("Expires: Wed, 11 Jan 1984 05:00:00 GMT"); // Date in the past
?>

Ein Perl-Beispiel finden Sie hier https://stackoverflow.com/questions/18056127/set-http-header-in-Perl-to-force-download-the-content

Wenn keiner von denen zutrifft, kommt hier ...

Der schnelle und schmutzige Weg.

Wenn Sie nicht verhindern können, dass der Anruf im Cache gespeichert wird, ändern Sie einfach den Anruf und "tricksen" den Cache aus. GET data.txt - Alles, was anders ist, muss jedes Mal anders sein

Eine gebräuchliche Methode besteht darin, entweder eine Zufallszahl oder die aktuelle Zeit in Millisekunden oder eine Kombination aus beiden zu verwenden.

var ms = Date.now();
var xhttp = new XMLHttpRequest();
var data = xhttp.open("GET", "data.txt?dummy="+ms, false);
9
Antony Gibbs

Der richtige Weg wäre, die Apache-Konfiguration (über htaccess oder conf-Datei) mit den abgelaufenen Headern mit sehr geringer Caching-Zeit zu ändern. Überprüfen Sie nochmals, ob Sie Zugriff auf die .htaccess-Datei haben, wenn es sich nicht um eine Apache conf-Datei handelt.

Wenn Sie jedoch .htaccess oder Apache conf absolut nicht ändern können, gibt es möglicherweise einen Trick, um dies zu erreichen. Die meisten Entwickler verwenden diesen Trick, um den Browser-Cache zu erneuern, wenn sie Änderungen an Dateien vornehmen, die für längere Zeit im Browser-Cache zwischengespeichert werden. Dieser Trick kann jedoch auch in Ihrem Fall verwendet werden.

Der Trick ist, die Version an den Dateinamen anzuhängen. z.B. data.txt?v=1 zum Löschen des Browser-Cache. In Ihrem Fall können Sie eine Zufallszahl als Versionsnummer verwenden, sodass der Browser die Datei bei jedem Aufruf erneuert. Wenn die Zufallszahl wiederholt wird, wird dem Benutzer jedoch erneut eine alte Datei angezeigt. Sie können Math.random(); für die Zufallsgenerierung in JS verwenden.

var data = xhttp.open("GET", "data.txt?v=0.2544544383", false);

Achtung: Dies ist nur ein Trick und nicht der richtige Weg. Dies verringert lediglich die Wahrscheinlichkeit, dass die zwischengespeicherte Datei auf eine sehr kleine Zahl zurückgeladen wird, garantiert jedoch nicht, dass die Cache-Datei nicht abgerufen wird.

Sie sollten den Caching-Zeitraum für TXT-Dateien im Browser überprüfen. Wenn es sehr groß ist (z. B. 1 Monat), sollten Sie diese Technik nicht verwenden. Wenn es jedoch viel niedriger ist (z. B. 1 Stunde), können Sie diese Technik verwenden, da die Wahrscheinlichkeit, dass dieselbe Zufallszahl für denselben Benutzer generiert wird, zunimmt niedriger.

2
Aakash