【问题标题】:Cache control static assets with query strings in htaccess在 htaccess 中使用查询字符串缓存控制静态资产
【发布时间】:2021-02-21 16:33:20
【问题描述】:

缓存控制指令是否需要指定 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
  • 确保在/etc/apache2/sites-available/mysite.conf 中将AllowOverride 设置为All
  • 尝试将/etc/apache2/apache2.conf 中的AllowOverride 设置为All 以获取/var/www/
  • 尝试直接在/etc/apache2/sites-available/mysite.conf 中添加指令
  • 更改后重启 apache:service apache2 restart

【问题讨论】:

    标签: apache .htaccess http caching


    【解决方案1】:

    mod_headers 模块未激活!

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

    如果标头模块列出:

    使用a2enmod headers 激活标头模块。

    使用service apache2 restart 重新启动 apache2 以实施更改。

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

    使用:\.(js)$

    请勿使用:\.(js)\?.*$

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2023-03-04
      • 2016-11-05
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多