添加Expires Header后Pingdom检测始终显示为0的问题求助
解决Pingdom检测中“添加Expires头”项始终为0的问题
系统环境
- CentOS 8.5
- 集成ModPagespeed模块的Apache服务器
- WordPress程序
- 启用"W3 Total Cache"插件
- 启用对接AWS Cloudfront CDN的"CDN Enabler"插件
- 同时使用Cloudflare服务
问题描述
已在WordPress中启用W3 Total Cache插件,且.htaccess文件包含mod_expires配置段,但Pingdom速度测试的**"Add Expires headers"**项始终显示为0。尝试在httpd.conf的虚拟主机目录配置中添加mod_expires规则,清除所有缓存并关闭Cloudflare的DNS代理后,问题仍未解决。
当前配置文件内容
httpd.conf 虚拟主机目录配置
<Directory /home/DOMAIN/public_html/site_1> # Allow Using .htaccess AllowOverride Fileinfo Options <IfModule pagespeed_module> ModPagespeed On # ---- Old Code Before ChatGPT Help ---- #ModPagespeedEnableFilters combine_css,combine_javascript #AddOutputFilterByType MOD_PAGESPEED_OUTPUT_FILTER text/html # ---- My Last Try with ChatGPT help ---- ModPagespeedEnableFilters inline_css,inline_javascript ModPagespeedEnableFilters collapse_whitespace,remove_comments ModPagespeedEnableFilters insert_dns_prefetch ModPagespeedEnableFilters lazyload_images ModPagespeedEnableFilters local_storage_cache ModPagespeedEnableFilters extend_cache ModPagespeedRewriteLevel PassThrough # Disable caching HTML files ModPagespeedDisableFilters rewrite_style_attributes ModPagespeedDisableFilters rewrite_style_attributes_with_url ModPagespeedDisableFilters prioritize_critical_css # Disable caching dynamic content ModPagespeedDisableFilters defer_javascript ModPagespeedDisableFilters inline_import_to_link ModPagespeedDisableFilters inline_google_font_css ModPagespeedDisableFilters rewrite_javascript_external </IfModule> <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpeg "access plus 1 week" ExpiresByType image/png "access plus 1 week" </IfModule> <IfModule mod_deflate.c> SetOutputFilter DEFLATE # AddOutputFilterByType DEFLATE text/html text/plain text/xml ... # Add additional MIME types you want to compress # Compress everything except images and PDFs SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|pdf)$ no-gzip dont-vary # Compress certain file types based on MIME types <IfModule mod_filter.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json application/rss+xml application/xml image/svg+xml # Add additional MIME types you want to compress </IfModule> </IfModule> </Directory>
.htaccess 文件片段
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css A31536000 ExpiresByType text/x-component A31536000 ExpiresByType application/x-javascript A31536000 ExpiresByType application/javascript A31536000 ExpiresByType text/javascript A31536000 ExpiresByType text/x-js A31536000 ExpiresByType text/html A3600 ExpiresByType text/richtext A3600 . . . . . . . . . . . . </IfModule>
排查与解决步骤
1. 确认mod_expires模块是否加载
CentOS 8.5的Apache默认可能未启用mod_expires,先检查模块状态:
httpd -M | grep expires
若无输出,说明模块未加载,执行以下命令启用并重启Apache:
dnf install httpd-mod_expires systemctl restart httpd
2. 解决ModPagespeed与Expires头的冲突
你的ModPagespeed配置中启用了extend_cache过滤器,该过滤器会覆盖或修改Expires头,导致Pingdom无法检测到预期规则。调整配置如下:
<IfModule pagespeed_module> # 禁用extend_cache过滤器,避免覆盖Expires头 ModPagespeedDisableFilters extend_cache # 禁止ModPagespeed修改缓存控制头 ModPagespeedModifyCachingHeaders off </IfModule>
3. 统一Expires规则优先级
httpd.conf和.htaccess的mod_expires配置可能冲突,建议将所有规则统一放在.htaccess中,并补充缺失的MIME类型:
<IfModule mod_expires.c> ExpiresActive On # 图片资源 ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType image/webp "access plus 1 month" # 样式与脚本 ExpiresByType text/css "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" ExpiresByType text/javascript "access plus 1 year" # 字体资源 ExpiresByType application/font-woff "access plus 1 year" ExpiresByType application/font-woff2 "access plus 1 year" # 文档与其他 ExpiresByType text/html "access plus 1 hour" ExpiresByType application/pdf "access plus 1 month" </IfModule>
4. 检查W3 Total Cache的缓存设置
W3 Total Cache的浏览器缓存设置可能覆盖.htaccess规则:
- 进入WordPress后台 → 性能 → 浏览器缓存
- 确保"设置HTTP头"选项启用,且缓存规则与手动配置的Expires时间一致
- 若已手动配置
.htaccess,可选择"禁用浏览器缓存"避免冲突
5. 验证CloudFront的缓存策略
AWS CloudFront可能覆盖源站的Expires头:
- 登录CloudFront控制台,检查对应分发的缓存策略
- 确保缓存策略允许源站的Expires和Cache-Control头传递给客户端
- 清除CloudFront边缘缓存
6. 手动验证响应头
使用curl命令直接请求静态资源,检查是否返回Expires头:
curl -I https://your-domain.com/wp-content/themes/your-theme/style.css
若响应中包含Expires: [具体日期]和Cache-Control: max-age=[数值],说明配置生效,Pingdom可能存在延迟,稍后重新测试即可。
内容的提问来源于stack exchange,提问作者Hady Shaltout
相关产品推荐
相关产品推荐

