如何通过.htaccess为指定文件设置Cache-Control缓存控制头?
缓存规则不生效的核心原因
- 服务器运行环境为Nginx:
.htaccess是Apache服务器专属的分布式配置文件,Nginx默认不会读取解析.htaccess里的任何规则,你返回的响应头里server: nginx已经明确了当前运行环境,这是规则不生效的最主要原因。 .htaccess规则本身存在语法错误:<Files>指令的匹配对象只能是本地文件/文件名,不能填写完整的URL路径,就算在Apache环境下这条规则也无法匹配到目标style.css文件。- 存在上层代理缓存:响应头里的
x-proxy-cache-info字段说明站点配置了前端代理缓存,就算后端服务设置了缓存头,也可能被代理层的缓存规则覆盖。
修正配置方案
方案1:修改Nginx配置(推荐,适配当前环境)
在Nginx站点配置文件中添加针对该CSS文件的缓存规则,示例配置如下:
location = /wp-content/themes/church-suite_child_theme/style.css { etag off; add_header Cache-Control "max-age=0, no-store, no-cache, must-revalidate"; add_header Pragma "no-cache"; add_header Expires "Thu, 30 June 2022 00:00:00 GMT"; }
添加后执行nginx -s reload重载配置即可生效。
方案2:若坚持使用Apache+.htaccess
先确认Nginx设置了将CSS文件请求转发到后端Apache处理,再修改.htaccess里的规则为正确写法:
<Files "style.css"> FileEtag None <IfModule mod_headers.c> Header Unset ETag Header Set Cache-Control "max-age=0, no-store, no-cache, must-revalidate" Header Set Pragma "no-cache" Header Set Expires "Thu, 30 June 2022 00:00:00 GMT" </IfModule> </Files>
如果该目录下还有其他同名style.css需要更精准匹配,可以用<Directory>指令嵌套缩小匹配范围。
方案3:WordPress原生方案(无需修改服务器配置)
直接在子主题的functions.php中给CSS入队规则添加动态版本号,每次修改CSS文件后自动更换版本号触发缓存更新,示例代码:
function custom_child_theme_enqueue_styles() { // 自动取文件修改时间作为版本号 $style_version = filemtime(get_stylesheet_directory() . '/style.css'); wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array(), $style_version ); } add_action( 'wp_enqueue_scripts', 'custom_child_theme_enqueue_styles' );
这个方案兼容性最高,不受服务器缓存规则影响。
内容的提问来源于stack exchange,提问作者PC888
相关产品推荐
相关产品推荐

