質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

4238閲覧

キャッシュを残したくない(Webサイトで使う全ファイル)

kjshdfiuasye

総合スコア29

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/06/10 02:12

編集2021/06/11 01:57

前提・実現したいこと

画像、javascript、css、html、php、動画など
ワードプレスのWebサイトで使うあらゆるファイルで
キャッシュを残したくない。

発生している問題・エラーメッセージ

あらゆるファイルでキャッシュを残さない設定方法がわからない

該当のソースコード

php

1header('Expires: Tue, 1 Jan 2018 00:00:00 GMT'); 2header('Last-Modified:' . gmdate( 'D, d M Y H:i:s' ) . 'GMT'); 3header('Cache-Control:no-cache,no-store,must-revalidate,max-age=0'); 4header('Cache-Control:pre-check=0,post-check=0',false); 5header('Pragma:no-cache');

出典元:
https://ysinc.co.jp/blog/wpcache/

試したこと

googleでキャッシュについて調査。

no-cacheよりno-storeを設定した方がいいとのこと。

方法1:htaccessを使う方法
方法2:phpのheader関数を使う方法
方法3:htmlのmetaタグの方法
上記3つが出てきた。

ーーーーーーー

方法1:htaccessについては拡張子を指定して制限すれば
そのファイルだけキャッシュ利用不可になるとのこと。
逆を言えば拡張子を指定しなければ全てのファイルに適用できそう。
ただしhtaccessファイル自体がキャッシュされてしまう可能性を
否定できる情報が見つからなかった。htaccessは影響範囲が多いので
できれば方法2がいい。

ーーーーーーー

方法2:phpに書くということで、php以外の画像ファイルや動画ファイルなどの他のファイルのキャッシュも残らないのかが不明。「no-store ワードプレス」などで検索しても、ワードプレスのどのファイルに上記該当のソースコードを記述すればいいのかの情報も出てこなかった。「no-store functions.php」でも成果なし。

ーーーーーーー

方法3:htmlに書くということで、html以外の画像ファイルや動画ファイルなどの他のファイルのキャッシュも残らないのかが不明。しかも記述しても効果がなかったという記事も散見される。

追記1:キャッシュを無効にしたい理由

更新したらすぐに反映させたいからです。ユーザー側にキャッシュを削除してもらうのは負担なので避けたいです。

追記2:キャッシュを無効にしたい範囲

フロントエンドで主に作業するので、
画像、javascript、css、html、動画  はキャッシュさせたくないです。

ワードプレスを利用するので、
php、データベース もキャッシュさせたくないです。

ただしワードプレスのシステムで使っている全ファイルの種類を網羅しているわけでないので、上記に挙げた種類のファイル以外にも「Webサイトで使うあらゆるファイル」というのが希望でした。しかし「あらゆるファイル」では質問としてあいまいで、抽象的すぎました。失礼いたしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/06/10 02:25

なぜ残したくないのでしょうか。 達成できたとしてそれだけのメリットがあるようには思えませんし、ユーザー観点だとパフォーマンス落ちるデメリットが大きいように思うのですが。
kjshdfiuasye

2021/06/10 03:10

ご質問ありがとうございます。理由といたしましては、更新したらすぐに反映させたいからです。ユーザー側にキャッシュを削除してもらうのは負担なので避けたいです。
退会済みユーザー

退会済みユーザー

2021/06/10 05:00

apache httpdやnginxなどのwebサーバーが出力するヘッダで有効期限を短くしておけば済むんじゃないかな。
m.ts10806

2021/06/10 06:01

質問本文に追記してください。 あと、css等の話であれば回避方法はいくらでも有りますし、「あらゆる」のカバーする範囲が決まってるかどうかにもよります。 ものにより対策も異なるでしょうし
kjshdfiuasye

2021/06/11 01:53

m6u様 ご回答ありがとうございます。いただいたご回答を今試している作業ですので、今しばらくお待ちいただければ幸いです。
kjshdfiuasye

2021/06/11 01:53

m.ts10806様 コメントありがとうございます。キャッシュ無効に関する、理由と範囲について追記いたしました。
guest

回答3

0

ベストアンサー

ただしhtaccessファイル自体がキャッシュされてしまう可能性を
否定できる情報が見つからなかった。

.htaccessは原理的にブラウザにキャッシュされるものでは無いので、
Apacheの前段にキャッシュサーバやCDNを設置していない限りは即時反映されますよ。

否定できる情報が無いというのはその通りだと思いますが、
自明の事なのでわざわざ言及する必要性が無い(そこまで言及すると、WEBサーバの動作から全部説明しないといけない)ためだと思います。


.htaccessがキャッシュされない(そもそもブラウザには渡されない)事を確認するには

  1. 画像読み込みなどが無いシンプルはHTMLを用意して、Chromeでアクセス
  2. 開発者ツールを開く(F12)
  3. リロードボタンを右クリック→キャッシュの消去とハード再読み込み
  4. 開発者ツール「Newwork」タブで全ての通信のレスポンスヘッダとレスポンスを確認して、.htaccessが送信されていないことを確認する

という感じで確認が出来ます。

コメントを受けての追記

Y.H.さんのコメント

Y.H.
2021/06/10 18:21

htaccessファイル自体がキャッシュされてしまう

厳密には、もともと200を返していたコンテンツで.htaccessにCache-Controlなどを追加しても
200返していた時のレスポンスをキャッシュしていた場合はリクエスト飛ばないので.htaccessに記載したものが反映されないとかのことを言っているのかなと。

はその通りで、
.htaccess(やApacheの設定)によって全てのリソースをCache-Controlヘッダによってキャッシュしない様に設定した場合でも、既にキャッシュされているリソースについては無力です。

これをクリアするためにはブラウザ側でキャッシュをクリアするか、キャッシュの寿命が尽きるのを待つしかありません。

全てのリソースをキャッシュしない設定を有効に出来ていれば、
キャッシュの寿命が尽きた後は全てのリソースがキャッシュされなくなるため、
初回のみキャッシュをクリアしてもらうか寿命が過ぎるのを待てば、それ以降は問題が無くなります。

投稿2021/06/10 09:13

編集2021/06/10 09:48
tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2021/06/10 09:21

> htaccessファイル自体がキャッシュされてしまう 厳密には、もともと200を返していたコンテンツで.htaccessにCache-Controlなどを追加しても 200返していた時のレスポンスをキャッシュしていた場合はリクエスト飛ばないので.htaccessに記載したものが反映されないとかのことを言っているのかなと。
tanat

2021/06/10 09:25

> Y.H.さん ああ、なるほど。 確かに仰る通りの問題は発生しますね。 ご指摘ありがとうございます。 全リソースをキャッシュしないと言う要件であっても初回はどうにもならないですね。 回答時の要件解釈や前提条件、考えられる課題を追記します
kjshdfiuasye

2021/06/11 01:46

ご回答ありがとうございます。新規サイトであれば公開前にキャッシュ無効設定を済ませておけば、公開後、一般の訪問者にはキャッシュは保存されなさそうですね。新規作成サイトでなく、もう公開されている既存のサイトでキャッシュをコントロールするのは難しそうですね。
tanat

2021/06/11 01:57

> もう公開されている既存のサイトでキャッシュをコントロールするのは難しそうですね。 そうですね。 とは言っても無限にキャッシュが残る訳ではないので、既存のコンテンツでもコンテンツ更新の何日か前にに.htaccessだけ更新しておけば問題が出ないケースが多いと思いますよ(既存のキャッシュの寿命次第ですが)
kjshdfiuasye

2021/06/11 02:10

ご回答ありがとうございます。 >更新の何日か前にに.htaccessだけ更新しておけば問題が出ないケースが多いと思います ↑承知しました。
guest

0

webサーバープログラムがHTTP応答時に付与するHTTPヘッダに、
有効期限をつけておけば、お望み通りになるかと。
(ただし、レンタルサーバーによってはサービスの規模に依って、データ転送量による制限や規制が加わる可能性もありますので、契約などご確認を。)

例えばapache httpdの例で行くと、
mod_expires - Apache HTTP Server Version 2.4
Alternate Interval Syntax
に関する設定を施すことで、
ExpiresActive On
ExpiresDefault "access plus 60 seconds"
とかなら、せいぜい保って60秒になったりするかと。
ExpiresByType ディレクティブを駆使して、特定のMIMEタイプでは短く長くなども出来るようです。

投稿2021/06/10 05:07

編集2021/06/11 04:00
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kjshdfiuasye

2021/06/11 01:54

ご回答ありがとうございます。テスト環境で試してみます。
kjshdfiuasye

2021/06/11 03:21

<ifModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 3 seconds" </ifModule> と書きました。 テストページで約5秒ごとに再読み込みを繰り返したところ chrome検証ツールのnetworkタブのsize列は毎回「(disk cache)」「(memory cache)」となりませんでしたのでキャッシュ無効になったようです。safariは「リクエストはなく、メモリキャッシュから提供されました。」となってしまいました。 <ifModule mod_headers.c> Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" </ifModule> としたところ500Internal Server Errorとなり、レンタルサーバーの仕様を確認すると「ご利用可能なディレクティブはAuthConfig と Limit のみ」とのことでした。
退会済みユーザー

退会済みユーザー

2021/06/11 04:01

Google Chromeで試すときは、Shiftキーを押しながら再読込ボタンをクリックしないと、 キャッシュした内容で表示し直すので注意です。
退会済みユーザー

退会済みユーザー

2021/06/11 04:04

極端すぎる値は、webブラウザで無視される可能性もありますよね。
kjshdfiuasye

2021/06/14 01:02

コメントありがとうございます。 >Google Chromeで試すときは、Shiftキーを押しながら再読込ボタンをクリックしないと、 キャッシュした内容で表示し直すので注意です。 ↑承知しました。
kjshdfiuasye

2021/06/14 01:24

コメントありがとうございます。 >極端すぎる値は、webブラウザで無視される可能性もありますよね。 ↑確かに、3secondsでは短すぎたかもしれません。ためしに60secondsにしてみて2分後にアクセスしたところ、safariでキャッシュされてしまいました。画像、動画、css、javascriptはパラメーターをつけることで対処しようと思います。php、データベースのキャッシュについては諦めようと思います。ありがとうございました。
guest

0

質問者の「キャッシュ」はクライアント側のキャッシュ(ブラウザキャッシュ)の事だろうということで答えてみます。それらの方法はすべてクライアントに「キャッシュしないでね」というお願いだと思うので、結局の所はクライアントの仕様によるのだと思います。何が何でも絶対にキャッシュさせないというのは難しいのかもしれません。先人の方が試されてもダメだったということは、おそらくそういうことだったと思います。

何とかしたいと考えるなら、サーバサイドレンダリングでSPAでサイトを構築するとか、ストリーミング動画配信のような表現でサイトを構築するとか、根本的に違う方法を試すとかになるんでしょうか。それで「キャッシュ」を防げるかどうかはなんともですが。

投稿2021/06/10 02:24

AbeTakashi

総合スコア4853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kjshdfiuasye

2021/06/10 03:15

ご回答ありがとうございます。説明不足で申し訳ございません。おっしゃる通りブラウザに残るキャッシュのことです。命令ではなくあくまでお願いだったのですね。ありがとうございました。学習コストがかからない対策として、画像・動画・js・cssファイルならパラメーターをつければいい気もしてきましたが、htmlやphpはどうしたものかという感じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問