【システム】Cloudflareに公開側トップページもキャッシュされないようになっている
概要
Cache-Controlヘッダーが、Cloudflareにトップページも配下もすべてキャッシュされない no-store 指定になっています。
管理画面、フォーム、管理画面ログイン時のフロント表示のみキャッシュしないように、
Cache-Control の指定を no-cache,no-store と調整し、公開側の no-store 指定をなくすことを提案します。
no-store があると、Cloudflare側でキャッシュしません。
baserCMS version : 5.1.5
備考
併せて4系の現状と調整の理想を挙げます。
| 対象 | 現状 | 調整の理想 |
|---|---|---|
| トップページ | no-cache | no-cache |
| メールフォーム | no-cache | no-cache, no-store |
| 管理画面 | no-cache | no-cache, no-store |
| 管理画面ログイン時のフロント表示 | no-cache | no-cache, no-store |
@kaburk @uchin0 こちらの件、意見を頂いてもいいですか?
@ryuring
Issueに記載の通りトップページ配下がno-storeになっている状況は解消したいです。
トップページ配下でno-cacheを指定するかどうかについては、
no-cacheが指定されている場合、リソースが更新されていないかオリジンサーバへ問い合わせを行うようなので、CDNを利用したサーバー負荷の低減を狙うのであれば、以下のように設定してもよいかと思います。
Cache-Control: public, max-age=3600, s-maxage=3600
max-ageについては設定で変更できるようにすることも検討したいです。
.htaccessで設定したCache-Controlよりも、プログラムで設定したCache-Controlが優先されるのであれば、 公開側は、.htaccessでCache-Controlを設定する方針として、プログラムでは設定する必要はなさそう。
- 初期の以下のヘッダーはPHP由来
-
no-store, no-cache, must-revalidate -
session_startを実行するとセットされる
-
- Cloudflareのキャッシュされる・されない情報
- https://developers.cloudflare.com/cache/concepts/default-cache-behavior/
- .htaccessでセットしたCache-ControlをPHPで上書きすることはできない?
- 通常、管理画面ログイン時はキャッシュを無効化するヘッダーがセットされる
-
no-store, no-cache, must-revalidate, post-check=0, pre-check=0 - セット箇所: plugins/baser-core/src/Controller/AppController->beforeFilter
-
- しかし、.htaccessに以下の記述を行うと.htaccessの記述のほうが優先される
-
Header set Cache-Control "public, max-age=3600, s-maxage=3600"
-
- 「Header add」や「Header setifempty」などやり方によってはいける?
- session_start実行前に
session_cache_limiter(false)を実行し、.htaccessでは「Header setifempty」を使えばいけそう
- session_start実行前に
- 通常、管理画面ログイン時はキャッシュを無効化するヘッダーがセットされる
- そのため、PHP側でキャッシュ有効・無効を制御する必要がある
- 対象の選定が難しい
- プラグインの追加などで対象はいくらでも増える
- 意図していないページのキャッシュは危険
- たまにCDNが原因で個人情報が流出したニュースがでる
- 意図したページのみキャッシュしたい
- デフォルトはキャッシュさせずに、CDNを使いたい人はキャッシュ対象のURLを.htaccessで設定してもらうのが安全そう
- 例えば固定ページのみキャッシュさせる、という括りも標準でやるには広すぎる気がする
- CDNはアセットファイルのみのキャッシュでも有用
トップページとserviceフォルダに対してのみキャッシュさせる.htacceesの例
<If "%{THE_REQUEST} =~ /^GET (\x2F |\x2Fservice\x2F)/">
Header set Cache-Control "public, max-age=3600, s-maxage=3600"
</If>
<If "%{THE_REQUEST} =~ /^GET \x2F /">
SetEnv CACHE_PUBLIC 1
</If>
<If "%{THE_REQUEST} =~ /^GET \x2Fservice\x2F/">
SetEnv CACHE_PUBLIC 1
</If>
Header set Cache-Control "public, max-age=3600, s-maxage=3600" env=CACHE_PUBLIC
8/21 baser mtgにて標準では対応不要とのことでクローズ 必要に応じて.htaccessやプラグインで調整