11

我正在为文件设置缓存控制标头。我想max-age=86400为所有.css.js以及max-age=3600所有其他人设置。

<FilesMatch "\.(css|js)$">
    Header append Cache-Control max-age=86400
</FilesMatch>

<FilesMatch "???">
    Header append Cache-Control max-age=3600
</FilesMatch>

我不知道我应该写什么正则表达式来反转\.(css|js)$匹配。或者也许还有其他方法可以做到这一点?

更新。基于这个问题的答案,我找到了可行的解决方案:

<FilesMatch "(?<!\.css|\.js)$">
    Header append Cache-Control max-age=3600
</FilesMatch>

不幸的是,找不到将点留\.在括号外的方法。但这个解决方案对我来说仍然很好。

附带说明一下,所有其他文件都包括根本没有文件名的文件,例如http://example.com/.

4

3 回答 3

8

基于这个问题的答案,我找到了可行的解决方案:

<FilesMatch "(?<!\.css|\.js)$">
    Header append Cache-Control max-age=3600
</FilesMatch>

不幸的是,找不到将点留\.在括号外的方法。但这个解决方案对我来说仍然很好。

于 2012-11-20T02:27:55.947 回答
3

您应该检查字符串末尾的真实文件扩展名(这是最后一个不包含点的子字符串)

.+\.(?!(css|js)$)[^\.]+?$

解释:

  • .+\.贪婪地搜索整个字符串以找到最后一个点。
  • (?!(css|js)$)跳过任何.css.js终止到行尾(但保留例如.jsx
  • [^\.]+?$获取扩展部分(直到字符串末尾没有点)
于 2012-10-17T08:41:00.943 回答
1

你可以试试这个。

.+?\.(?!(css$|js$)).+

第一组.+?获取文件名,第二组否定前瞻组?!(css$|js$)检查文件结尾不是 css 或 js。这仅匹配没有 .css 或 .js 扩展名的文件。您可以替换第一个和最后一个。基于允许的文件名字符的字符类。

编辑:这将匹配 test.cssx 或 test.jxabc

于 2012-10-17T03:36:27.030 回答