144

クラウドサーバーで実行されているphpサイトがあります。新しいファイルcss、js、または画像を追加するたびに、ブラウザはキャッシュに保存されている同じ古いjs、css、および画像ファイルをロードします。

私のサイトには、以下のようなDoctypeとメタタグがあります

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Page-Exit" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Exit" content="blendTrans(Duration=1.0)">

上記のDoctypeとメタコードのために、新しいファイルではなく、ブラウザにキャッシュされた同じファイルをロードしていますか?

4

6 に答える 6

337

これを試して

<?php

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
于 2012-11-30T06:33:23.610 に答える
44

ここで、HTMLを介して制御する場合は、以下のオプション1のようにします。

<meta http-equiv="expires" content="Sun, 01 Jan 2014 00:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache" />

そして、PHPを介してそれを制御したい場合:オプション2のようにそれを行います。

header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');

そして、オプション2は、プロキシベースのキャッシュの問題を回避するために常に優れています。

于 2014-02-06T17:17:25.683 に答える
12

あなたはこれを試すことができます:

    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Connection: close");

うまくいけば、もしあれば、キャッシュを防ぐのに役立つでしょう!

于 2015-01-27T10:56:00.567 に答える
10

cssファイルのキャッシュに問題がありました。PHPでヘッダーを設定しても役に立ちませんでした(おそらく、ヘッダーは、それにリンクしているページではなく、スタイルシートファイルで設定する必要があるためですか?)。

私はこのページで解決策を見つけました:https ://css-tricks.com/can-we-prevent-css-caching/

ソリューション:

リンクファイルのURIのクエリ部分としてタイムスタンプを追加します。
(css、js、画像などに使用できます)

開発用:

<link rel="stylesheet" href="style.css?<?php echo date('Y-m-d_H:i:s'); ?>">

本番環境の場合(キャッシングが主に良いことです):

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(必要に応じて手動で書き直してください)

またはこれら2つの組み合わせ:

<?php
    define( "DEBUGGING", true ); // or false in production enviroment
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo (DEBUGGING) ? date('_Y-m-d_H:i:s') : ""; ?>">

編集:

または、これら2つのより美しい組み合わせ:

<?php
    // Init
    define( "DEBUGGING", true ); // or false in production enviroment
    // Functions
    function get_cache_prevent_string( $always = false ) {
        return (DEBUGGING || $always) ? date('_Y-m-d_H:i:s') : "";
    }
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo get_cache_prevent_string(); ?>">
于 2015-10-12T13:11:49.200 に答える
6

場合によっては、ブラウザのキャッシュを防ぐことはお勧めできません。解決策を探して私はこのような解決策を見つけました:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=filemtime($file);?>">

ここでの問題は、サーバーでの更新中にファイルが上書きされた場合(私のシナリオ)、ファイルの内容が同じであってもタイムスタンプが変更されるため、キャッシュが無視されることです。

このソリューションを使用して、コンテンツが変更された場合にのみ、ブラウザーにアセットのダウンロードを強制します。

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=hash_file('md5', $file);?>">
于 2018-06-21T19:01:46.257 に答える
1

キャッシュされたファイルにクエリ文字列を使用することもできます。スタイルやjsファイルの動作には影響しません。

例えば:

example.com/mystyle.css -> 
example.com/mystyle.css?<?php echo random(1000, 5000); ?>
于 2021-03-02T19:34:57.473 に答える