倒置的FilesMatch?

时间:2012-10-17 03:19:46

标签: regex .htaccess

我正在为文件设置缓存控制标头。我想为所有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)$匹配。或者也许有其他方法可以做到这一点?

更新即可。根据{{​​3}}回答,我找到了有效的解决方案:

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

不幸的是找不到将点\.留在括号之外的方法。但这个解决方案仍然适合我。

作为旁注,所有其他文件包括完全没有文件名的文件,例如http://example.com/

3 个答案:

答案 0 :(得分:4)

根据this question回答,我找到了有效的解决方案:

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

不幸的是,找不到将\.点放在括号之外的方法。但这个解决方案仍然适合我。

答案 1 :(得分:3)

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

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

说明:

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

答案 2 :(得分:1)

你可以试试这个。

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

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

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