7

localhost で js コードをデバッグしていますが、ブラウザによるファイルのキャッシュを防止する必要があります。Chrome デバッガーのブレークポイントが消去されるため、URL に追加されたタイムスタンプを使用できません。

通常、キャッシュを更新する必要はありませんが、しばらくの間は全員が更新する必要があります。他の場所でバグを探しに行くので、これは大きな問題です。少し前にこのコードをApacheに追加しました:

    <IfModule mod_headers.c>
            Header add Expires "Sun, 19 Nov 1978 05:00:00 GMT"
            Header add Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
    </IfModule>

Apache がファイルを有効と間違えたり、これを完全に修正できる構成コードにいくつかの追加を提供したりする理由を誰かが説明できますか?

以下のソリューションを使用したヘッダー:

<IfModule mod_expires.c>
  expiresActive On
  ExpiresDefault "access plus 1 seconds"
  ExpiresByType text/html "access plus 1 seconds"
  ExpiresByType text/javascript "access plus 1 seconds"
  ExpiresByType application/x-javascript "access plus 1 seconds"
</IfModule>

http://localhost/static/images/%d0%9a%d0%be%d0%bf%d0%b8%d1%8f%20logo_inner.png

GET /static/images/%d0%9a%d0%be%d0%bf%d0%b8%d1%8f%20logo_inner.png HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/static/images/
Cache-Control: max-age=0

HTTP/1.1 200 OK
Date: Sun, 23 Dec 2012 19:33:20 GMT
Server: Apache/2.2.22 (Ubuntu)
Last-Modified: Thu, 28 Jun 2012 17:32:51 GMT
Etag: "b3c27-f1f-4c38bb88d96c0"
Accept-Ranges: bytes
Content-Length: 3871
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: image/png



HTTP/1.1 200 OK
Date: Sun, 23 Dec 2012 19:33:54 GMT
Server: Apache/2.2.22 (Ubuntu)
Last-Modified: Thu, 28 Jun 2012 17:32:51 GMT
Etag: "b3c27-f1f-4c38bb88d96c0"
Accept-Ranges: bytes
Content-Length: 3871
Cache-Control: max-age=1
Expires: Sun, 23 Dec 2012 19:33:55 GMT
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/png




The second request:

http://localhost/static/images/%d0%9a%d0%be%d0%bf%d0%b8%d1%8f%20logo_inner.png

GET /static/images/%d0%9a%d0%be%d0%bf%d0%b8%d1%8f%20logo_inner.png HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/static/images/
If-Modified-Since: Thu, 28 Jun 2012 17:32:51 GMT
If-None-Match: "b3c27-f1f-4c38bb88d96c0"
Cache-Control: max-age=0

HTTP/1.1 304 Not Modified
Date: Sun, 23 Dec 2012 19:34:58 GMT
Server: Apache/2.2.22 (Ubuntu)
Connection: Keep-Alive
Keep-Alive: timeout=15, max=99
Etag: "b3c27-f1f-4c38bb88d96c0"
Expires: Sun, 23 Dec 2012 19:34:59 GMT
Cache-Control: max-age=1
4

2 に答える 2

12

静的ファイルを配信するとき、Apache はファイルのチェックサムのようなものである ETag ヘッダーを送信します。ブラウザーはファイルをキャッシュし、次の要求で送信される ETag を記憶します。

ファイルが変更された場合、ブラウザーの ETag が異なる必要があり、Web サーバーは再送信する必要があります。etag が等しい場合、Web サーバーは304 Not Modified. ETag メカニズムは、他のキャッシュ ヘッダーよりも優先度が高くなります。

etags を無効にするには、Apache を使用できます

FileETag None

http://httpd.apache.org/docs/current/en/mod/core.html#fileetag

ウィキペディアには、Etag ヘッダーに関するすばらしい記事があります http://en.wikipedia.org/wiki/HTTP_ETag

編集

これは防水構成である必要があります

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>

構成の変更を有効にするには、サーバーを再起動する必要があることを忘れないでください。

sudo /etc/init.d/httpd restart

EDIT2

構成を filesMatch でラップして、特定のファイル拡張子のみのキャッシュを無効にします

<filesMatch ".(php|js|css)$">
    FileETag None
    [..]
</filesMatch>
于 2012-12-23T20:47:58.830 に答える
2

あなたの要件を正しく理解していれば、アクセスしている Web ページについて Web ブラウザーに何も記憶させないようにし、Apache Web サーバーはそれを新しいページ要求のように処理する必要があります。最初に mod_expires と mod_headers を有効にすることをお勧めします。私は ubuntu を使用しているので、

a2enmod headers && a2enmod expires && service apache2 restart

最小限のキャッシュ制御を行うために以下のコードを追加するよりも、

<IfModule mod_expires.c>
  expiresActive On
  ExpiresDefault "access plus 1 seconds"
  ExpiresByType text/html "access plus 1 seconds"
  ExpiresByType text/javascript "access plus 1 seconds"
  ExpiresByType application/x-javascript "access plus 1 seconds"
</IfModule>

Firefox を使用している場合は、Live Http ヘッダー プラグインをインストール/実行することでこれをテストできます。Linux/Unix を使用している場合は、curl -v your_urlでこの要求を実行できます。

于 2012-12-21T06:37:27.103 に答える