web-dev-qa-db-ja.com

PHPサイトのブラウザキャッシュを防ぐ方法

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

私のサイトには、次のようなdoctypeとmetaタグがあります

<!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とメタコードのため、新しいファイルではなくブラウザにキャッシュされた同じファイルをロードしています

100
ArrayOutOfBound

これを試して

<?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");
?>
246
Codesen

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

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

また、PHPで制御する場合は、次のようにしますOption 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');

AND オプション2 ISプロキシベースのキャッシュの問題を回避するために常により良い。

27
Ritesh Aryal

これを試すことができます:

    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");

Cacheがある場合、それを防ぐのに役立つことを願っています!

9
Aakanksha

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(); ?>">
5
Lukas

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

<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);?>">
3
ismavolk