web-dev-qa-db-ja.com

ブラウザがテキストファイルをキャッシュしないようにする

組織のイントラネット上のApacheサーバーで実行されるWebアプリケーションがあります。このWebアプリケーションには、JavaScriptを介して特定のテキストファイルを読み込むJavaScript関数があります

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

Webappの使用中に、このテキストファイルの内容が変更される場合があります。これらの変更は、Webアプリに反映する必要があります。つまり、テキストファイルを再読み込みする必要があり、ブラウザーのキャッシュから読み取る必要はありません。ただし、ブラウザ(特にChromium)はテキストファイルをキャッシュします。ブラウザが常にテキストファイルをサーバーに要求し、キャッシュしないことで何ができますか?

これは常にHTML/JavaScript(またはPerl)のみでリロードできますか?

Apacheサーバー構成にアクセスできません。このアプリは、多くのPerlスクリプトを使用して、私には馴染みがないがアクセスできるWebページを作成します。

4
nutgoodinuff

この問題には2つのアプローチがあります。

クリーンな方法は、GET data.txtに対して返されるヘッダーを設定して、ブラウザ(またはプロキシ)が応答をキャッシュに保存しないようにすることです。 Apacheを使用すると、これは通常、.htaccessファイルに数行を追加することで実行できます。このdata.txtが静的ファイルの場合、これがヘッダーを制御できる唯一の方法です。から 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>

GET data.txtがスクリプト(Perl、php、Javaなど)によって処理される場合、それらのヘッダーの設定はスクリプト自体から実行できます(コンテンツが送信される前に実行する必要があります)。ここに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
?>

Perlの例はここにあります https://stackoverflow.com/questions/18056127/set-http-header-in-Perl-to-force-download-the-content

それらのどれもが当てはまらない場合、ここに来る...

迅速で汚れた方法

コールがキャッシュされるのを防ぐことができない場合は、コールを変更してキャッシュを「トリック」するだけです。 GET data.txt?anyting-different-here-will-do-the-job.just-needs-to-be-be-different-be-time-time-time

一般的な方法は、乱数を使用するか、現在の時刻をミリ秒単位で使用するか、両方を組み合わせて使用​​することです。

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

正しい方法は、非常に短いキャッシュ時間でexpireヘッダーを使用してApache構成を(htaccessまたはconfファイル経由で)変更することです。 Apache confファイルでない場合、.htaccessファイルにアクセスできるかどうかを再確認してください。

ただし、.htaccessまたはApache confを絶対に変更できない場合は、それを達成するためのコツがあります。ほとんどの開発者はこのトリックを使用して、ブラウザキャッシュで長時間キャッシュされているファイルに何らかの変更を加えるたびにブラウザキャッシュを更新しますが、このトリックはあなたの場合にも使用できます。

トリックは、ファイル名にバージョンを追加することです。例えばdata.txt?v=1はブラウザのキャッシュをクリアします。あなたの場合、ブラウザが呼び出しごとにファイルを更新するように、バージョン番号として乱数を使用できます。ただし、乱数が繰り返されると、ユーザーには古いファイルが再び表示されます。 JSでの乱数生成にはMath.random();を使用できます。

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

注意:これは単なるトリックであり、正しい方法ではありません。キャッシュファイルをリロードする可能性を非常に小さな数に減らすだけですが、キャッシュファイルがフェッチされないことを保証しません。

ブラウザでの.txtファイルのキャッシュ期間を確認する必要があります。非常に大きい場合(1か月など)、この手法は使用しないでください。はるかに低い場合(1時間など)、同じユーザーに対して同じ乱数が生成される確率が高くなるため、この手法を使用できます。低い。

2
Aakash