3

現在、仮想ホストでこのセットアップを使用しています。

<Location />
  SetOutputFilter DEFLATE
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI \
  \.(?:gif|jpe?g|png)$ no-gzip dont-vary
  Header append Vary User-Agent env=!dont-vary
</Location>
<Directory />
  ExpiresActive On
  ExpiresByType text/html "access plus 5 minutes"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType image/jpg "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/x-icon "access plus 1 month"
  ExpiresDefault "access plus 1 day"

  <FilesMatch "\.(ico|jpeg|pdf|flv|jpg|png|gif|js|css|swf)$">
    Header set Cache-Control "max-age=2592000, public"
    Header unset Last-Modified
    Header unset ETag
    FileETag None
  </FilesMatch>
  <FilesMatch "\.(html|php)$">
    Header set Cache-Control "max-age=900, public, must-revalidate"
  </FilesMatch>
</Directory>

スピードアップには効果的ですが、ユーザー自身がコンテンツに加えた変更が表示されない場合があります (主に FireFox の使用時) :( 何か提案 / 最適化のヒントはありますか?

4

3 に答える 3

1

ブラウザーにキャッシュを強制する代わりに、再検証が必要なヘッダーを送信し、Expires および Last-Modified ヘッダーを送信して、プログラミング言語 (PHP など) 内からキャッシュを制御する必要があります。ブラウザは、リクエストごとにサイトに最新バージョンを要求しますが、何も変更されていない場合は、必ず空のページで応答してください.

実装には時間がかかるかもしれませんが、確実に機能します。

于 2010-12-16T09:25:26.247 に答える
0

ここでの問題は、ブラウザが JavaScript、CSS、および画像をキャッシュするため、キャッシュの有効期限が切れない限り、サーバーで何かを変更したかどうかがわからないことです。

たとえば、script.js という名前の JS ファイルがあるとします。htaccessファイルにある次のルールに従って、

ExpiresByType application/x-javascript "access plus 1 month"  
ExpiresByType application/javascript "access plus 1 month"

JavaScript ファイルは 1 か月間キャッシュされるため、キャッシュを手動でクリアしない限り、1 か月間は JS ファイルに対する新しいリクエストは要求されません。

この問題を解決する方法。

ファイル名がscript.jsであると仮定すると、HTMLファイルに次のように含める必要があります

<script src="includes/script.100.js" type="text/javascript"></script>

また

<link rel="stylesheet" type="text/css" href="includes/style.100.css" />  

100は何の数字でも構いません。私は通常、1、2、3.. など (正確にはバージョン番号) から増やします。

今、私のhtaccessには、次のようなものがあります

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/style\.[\d]+\.css$ /includes/style.css [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/script\.[\d]+\.js$ /includes/script.js [L]

上記の 2 つの条件により、ファイル名とファイルタイプの間で使用される番号に関係なく、実際のファイルが使用されることが保証されます。

これにより、変更を行うたびに、バージョン番号を変更すると、すべての古いキャッシュが期限切れになり、すべてのユーザーが最新のコードを確認できるようになります。

于 2010-12-11T11:35:42.040 に答える
0

問題は内容に基づいており、js/css ファイルに基づいていないという Hannes からの返信の後に、このコメントを投稿します。

私は一度この問題を抱えていましたが、何が問題なのかを理解することができませんでした。その理由は、HTML ページが、私とブラウザーの間のプロキシ サーバーのどこかにキャッシュされているためではないかと推測しました。

それで、私がしたことは、md5(time("U")); のようなものを持つハッシュと呼ばれるクエリパラメーターで生成された URL でした

たとえば、同じ問題があった URL は次のようなものでした

http://test.com/controller/関数名/

この問題の後、ユーザーがクリックするすべての URL が次のようになるように変更しました

http://test.com/controller/functionname/?hash= {何か}.

うまくいくことを願っています。また、Web ページに追加することもできます。

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
于 2010-12-13T14:20:48.763 に答える