basercms icon indicating copy to clipboard operation
basercms copied to clipboard

【システム】Cloudflareに公開側トップページもキャッシュされないようになっている

Open fuchigam1 opened this issue 1 year ago • 2 comments

概要

Cache-Controlヘッダーが、Cloudflareにトップページも配下もすべてキャッシュされない no-store 指定になっています。

管理画面、フォーム、管理画面ログイン時のフロント表示のみキャッシュしないように、 Cache-Control の指定を no-cache,no-store と調整し、公開側の no-store 指定をなくすことを提案します。 no-store があると、Cloudflare側でキャッシュしません。

baserCMS version : 5.1.5

Image

備考

併せて4系の現状と調整の理想を挙げます。

対象 現状 調整の理想
トップページ no-cache no-cache
メールフォーム no-cache no-cache, no-store
管理画面 no-cache no-cache, no-store
管理画面ログイン時のフロント表示 no-cache no-cache, no-store

fuchigam1 avatar Feb 07 '25 05:02 fuchigam1

@kaburk @uchin0 こちらの件、意見を頂いてもいいですか?

ryuring avatar Feb 09 '25 04:02 ryuring

@ryuring Issueに記載の通りトップページ配下がno-storeになっている状況は解消したいです。

トップページ配下でno-cacheを指定するかどうかについては、 no-cacheが指定されている場合、リソースが更新されていないかオリジンサーバへ問い合わせを行うようなので、CDNを利用したサーバー負荷の低減を狙うのであれば、以下のように設定してもよいかと思います。 Cache-Control: public, max-age=3600, s-maxage=3600

max-ageについては設定で変更できるようにすることも検討したいです。

uchin0 avatar Feb 09 '25 22:02 uchin0

.htaccessで設定したCache-Controlよりも、プログラムで設定したCache-Controlが優先されるのであれば、 公開側は、.htaccessでCache-Controlを設定する方針として、プログラムでは設定する必要はなさそう。

uchin0 avatar Jun 27 '25 04:06 uchin0

  • 初期の以下のヘッダーは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」を使えばいけそう
  • そのため、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

seto1 avatar Jun 30 '25 08:06 seto1

8/21 baser mtgにて標準では対応不要とのことでクローズ 必要に応じて.htaccessやプラグインで調整

seto1 avatar Aug 21 '25 07:08 seto1