我正在使用本文底部的配置在 CentOS 上设置 Apache 缓存,mod_cache
但页面未被缓存。我包括了一些调试信息。mod_cache_disk
CacheDetailHeader on
当我点击该页面时,HTTP 响应显示出来X-Cache-Detail: "Expires header already expired; not cacheable"
,并且 Expires 标头设置为 1981 年的某个日期,尽管该日期是正确的。
Date: Mon, 19 Aug 2019 23:39:03 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
该测试使用 Chrome 隐身浏览器在公共 WordPress 页面上进行。
完整配置。CacheRoot 存在并且对 Apache 用户可写。
# The following line could be required or not depending on your Apache installation
LoadModule cache_module modules/mod_cache.so
<IfModule mod_cache.c>
CacheQuickHandler off
CacheDetailHeader on
CacheIgnoreNoLastMod On
CacheDefaultExpire 7200
CacheIgnoreCacheControl On
CacheLastModifiedFactor 0.5
CacheIgnoreHeaders Set-Cookie Cookie
CacheHeader on
CacheLock on
CacheDisable /wp-admin
CacheDisable /wp-login.php
CacheDisable /wp-cron.php
SetOutputFilter CACHE
AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/rss+xml text/xml image/svg+xml
# The following line could be required or not depending on your Apache installation
LoadModule cache_disk_module modules/mod_cache_disk.so
<IfModule mod_cache_disk.c>
CacheRoot /var/cache/apache2/mod_cache_disk
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
CacheMaxFileSize 2000000
</IfModule>
</IfModule>
仅供参考 - 我使用 mod_cache 和 WP 的原因是这个项目基于基岩框架似乎与 WP Super Cache 和其他插件配合得不太好。他们建议使用Memcached、Nginx 或 Varnish,我无权安装其中任何一个。
更新
WP_CACHE
被设定为true
- 添加
CacheMaxExpire 86400
到配置中,X-Cache-Detail
错误更改为s-maxage or max-age zero and no Last-Modified or Etag
,Cache-Control
标题现在是Cache-Control: private, proxy-revalidate, s-maxage=0
- 添加
mod_expires
:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/html "access 1 month"
...
</IfModule>
答案1
PHP 配置为在启动会话的页面上发送缓存禁用标头,包括您显示的 Expires: 标头。此日期对应于PHP 开发人员的生日谁实现了这个功能。
您可以通过设置来配置此行为session.cache_limiter
在php.ini
。
如果您正在运行 WordPress,则无需将其默认设置为nocache
,因为带有此标头的页面对应于发送给登录或已登录用户的页面,因此无论如何都不应被 Apache 缓存。不过,您可以将其更改为private
或private_no_expire
以允许登录用户的浏览器缓存页面。
要测试您的缓存,请使用隐身窗口并在注销后访问您的 WordPress 网站。