Closed shimoju closed 9 years ago
Railsのasset pipelineのように、
なら、このように設定できる
# For Apache:
# The Expires* directives requires the Apache module
# `mod_expires` to be enabled.
<Location /assets/>
# Use of ETag is discouraged when Last-Modified is present
Header unset ETag
FileETag None
# RFC says only cache for 1 year
ExpiresActive On
ExpiresDefault "access plus 1 year"
</Location>
# For NGINX:
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
WordPressにはasset用のディレクトリはないし、CSS・JSには?ver=x
のクエリがつくものの必ずついているわけではないので、1年キャッシュさせるのは怖い
が良いのでは
https://github.com/shimoju/wordpress-heroku/commit/102e91f2005b82529cc6577fb5fe6b3b91d66db0
ApacheだとHeader append
できちんと既存のヘッダに追加されて、
Cache-Control: max-age=2592000, public
となるが、nginxでは既存のヘッダに追加はできないみたいで二重になる
Cache-Control: max-age=2592000
Cache-Control: public
https://github.com/shimoju/wordpress-heroku/commit/3b33198fdafaa3546471d1bd66995f0fc8f0c529
ヘッダ重複問題に対処するため、Expires
を使わずCache-Control
のみで設定するようにした
設定値がわかりにくくなるが、頻繁には変更しないので許容範囲内かなと
Cache-Control: public, max-age=2592000
それと同時にETagを無効にした
https://github.com/shimoju/wordpress-heroku/commit/3111d049e866d89dc4706f8f900710714f001482
これで想定通り動いているのでclose
と思ったらNginxでは
There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level. http://nginx.org/en/docs/http/ngx_http_headers_module.html
とあり、何らかのadd_header
ディレクティブがある場合は前のレベルからヘッダが継承されなくなるらしい
add_header X-Content-Type-Options "nosniff";
を追加したが、location内にadd_headerを書いているのでX-Content-Type-OptionsなどがCSS・JSや画像に適用されなくなってしまったlocation内でヘッダを再度定義してもいいが、DRY的に嫌
expires
を使うとこの挙動にはならないようなので、expiresを使うように戻して、Cache-Control: public
は付与しないようにした
https://github.com/shimoju/wordpress-heroku/commit/427c0d94cf862efd36fff611c9b2736f8bd92cfd
Googleによると、publicはなくてもよいとのこと
“public” と “private” レスポンスが “public” として指定されている場合は、レスポンスに関連付けられた HTTP 認証があり、さらにレスポンスのステータス コードが通常キャッシュ可能になっていない場合でも、そのレスポンスはキャッシュに格納できます。ほとんどの場合、明示的なキャッシュ情報(”max-age” など)で レスポンスがキャッシュ可能であることが指定されているので、”public” は必要ありません。 https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ja
クライアント側のキャッシュ設定(Cache-Controlヘッダで主に静的コンテンツのキャッシュ)