0

So the issue I'm having is that I make changes to let's say a css file on my drupal website. That change shows up immediately on google chrome when I navigate to that part of the site that I was targeting. When I navigate to that part of the site in firefox, it shows me the old page that I have visited before. Of course a manual refresh of firefox fixes this.

The problem lies in the fact that when the user will see an older version of the page, they may not know to hit the refresh button, and will assume it is broken.

So basically, is there a way to check if the current page has been cached and tell firefox to clear it in php, or perhaps a more elegant approach?

4

2 に答える 2

2

残念ながら、クライアントが PHP または任意のサーバー環境からページをキャッシュしたかどうかを簡単に見分けることはできません。ただし、キャッシュするかどうか、およびキャッシュする期間についてブラウザにアドバイスすることはできます。これは、Cache-Control HTTP ヘッダー (およびフレンド) を設定することによって実現されます。このページを参照してください。ほとんどの人は、今後数時間までのキャッシュを指定する傾向があるため、ユーザーは古いデータを 2 時間以上見ることはありません。これをお勧めしますが、キャッシュを完全に無効にするようブラウザに指示することもできます。とにかく、私の意見では、これらのヘッダーを .htaccess ファイルに設定するのが最も簡単な解決策です。

以下は、2 時間の制限時間の例です。

# Cache CSS and JS files for up to 2 hours
<FilesMatch "\.(css|js)$">
    <IfModule mod_headers.c>
        # Set Max-age to 7200 seconds (2 hours), revalidate after 2 hours (ask the server if the file's changed)
        Header set Cache-Control "max-age=7200, must-revalidate"
    </IfModule>
    FileETag MTime Size
</FilesMatch>

もう 1 つのオプションは、キャッシュを許可することですが、リクエストごとに何かが変更されたかどうかをクライアントにサーバーに問い合わせさせることです。特に多くの css および js ファイルを提供するページ (通常は Drupal の場合) では、ブラウザーはファイルごとにサーバーへのラウンドトリップ リクエストを行う必要があるため、それほど大きなメリットはありません。

# Only use cache if checking with the server results in a 304 (Not Modified)
<FilesMatch "\.(css|js)$">
    <IfModule mod_headers.c>
        # Instruct the client and possibly proxies in front of the client to check for new versions every 0 seconds (always)
        Header set Cache-Control "max-age=0, public, must-revalidate, proxy-revalidate"
        # For older browsers
        Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT"
    </IfModule>
    FileETag MTime Size
</FilesMatch>

最後に、ブラウザにキャッシュを無効にするように依頼できます。ページの読み込み時間がかかるため、ファイルが非常に頻繁に変更されることが確実でない限り、これはお勧めしません。

# Disable caching
<FilesMatch "\.(css|js)$">
    <IfModule mod_headers.c>
        Header set Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"
        # For older browsers
        Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT"
    </IfModule>
    FileETag MTime Size
</FilesMatch>
于 2012-07-21T01:27:30.000 に答える
0

より単純な (非 drupal) ソリューションの場合、スタイル メタ href の名前を別の名前に変更できます。例えば。 style.css?vers=1.0 ... style.css?vers=1.1 ... style.css?vers=1.1a ... など

Drupal の場合、 [すべてのキャッシュをクリア] ボタンをクリックすると、スタイル シート参照の名前が上記のように変更されます。(構成/開発/パフォーマンス)

于 2013-03-18T02:54:49.380 に答える