首页 > 解决方案 > 在 htaccess 中使用查询字符串缓存控制静态资产

问题描述

缓存控制指令是否需要指定 http 请求中是否存在查询字符串以进行正确匹配?

目前使用查询字符串进行静态资产版本控制,并为这些字符串禁用 Etag - 但这些指令无论如何都不会生效。查看标头,仍然使用 Etag,并且没有定义缓存控制。Gmatrix 和 Lighthouse 都声明静态资产没有缓存控制集。

请求的示例文件:app.js?v=1.3.5

这是 .htaccess 文件,然后是故障排除步骤

<IfModule mod_headers.c>
# One month for media files and icons
<FilesMatch "\.(ogg|mp3|ico|jpg|jpeg|png|svg|webp|webmanifest|xml)\?.*$">
Header set Cache-Control "max-age=2592000, public"
Header unset ETag
FileETag None
</FilesMatch>

# One week for CSS/JS files except service worker file
<FilesMatch "^(?!sw).+\.(css|json|js)\?.*$">
Header set Cache-Control "max-age=604800, public"
Header unset ETag
FileETag None
</FilesMatch>

# No cache for HTML files (checks with server for changes else serves cache)
<FilesMatch "\.(html)$">
Header set Cache-Control "no-cache, must-revalidate"
</FilesMatch>

<FilesMatch "^(sw\.js)$">
Header set Cache-Control "no-cache, no-store, must-revalidate"
</FilesMatch>
</IfModule>

故障排除步骤

指令似乎也不影响 html 页面,因此假设这可能是配置或语法问题。

标签: apache.htaccesshttpcaching

解决方案


模块未mod_headers激活!

用于apachectl -M检查活动模块(Debian/Ubuntu)。

如果未列出标头模块:

用于a2enmod headers激活标题模块。

重新启动 apache2service apache2 restart以实施更改。

此时可以测试是否需要在 FilesMatch 表达式中添加查询字符串。原来查询字符串需要从表达式中省略。

利用:\.(js)$

不要使用:\.(js)\?.*$


推荐阅读