apache - 在 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 页面,因此假设这可能是配置或语法问题。
- 使用验证器检查语法:https ://www.lyxx.com/freestuff/002.html
- 确保
AllowOverride
设置All
为/etc/apache2/sites-available/mysite.conf
- 尝试设置
AllowOverride
为All
_/etc/apache2/apache2.conf
/var/www/
- 尝试直接添加指令
/etc/apache2/sites-available/mysite.conf
- 更改后重新启动 apache:
service apache2 restart
解决方案
模块未mod_headers
激活!
用于apachectl -M
检查活动模块(Debian/Ubuntu)。
如果未列出标头模块:
用于a2enmod headers
激活标题模块。
重新启动 apache2service apache2 restart
以实施更改。
此时可以测试是否需要在 FilesMatch 表达式中添加查询字符串。原来查询字符串需要从表达式中省略。
利用:\.(js)$
不要使用:\.(js)\?.*$
推荐阅读
- reactjs - /static/js 文件夹来自哪里?
- php - 如何验证多个文件上传字段编辑默认 Voyager BREAD 控制器中的“validateBread”方法
- bridge.net - 使用 Bridge.NET 时遇到的承诺
- logging - 尝试获取 Google 表格日志
- python - pytest 请求在测试中使用的夹具参数
- sql - 2表中的数据插入
- java - 如何使用 Apache POI 将多个 excel 文件合并为单个 excel 文件
- javascript - 我应该总是在可以使用 Promise 的地方使用 Observables 吗?
- django - 无法调用 ModelManager 中的函数
- mysql - 使用不同的参数重复 SQL 查询