我必须将根目录 index.html 上的 Cache-Control max-age 设置为 1 小时,但将网站上其他每个文件的 Cache-Control max-age 设置为 1 天。因此子目录中的其他 index.html 文件也必须使用通常的 1 天过期时间。最好在 .htaccess 配置文件中设置。
这看起来是个小事,但到现在我还没找到解决办法。就算我放弃 .htaccess,我也只有一个尴尬的解决方案:
<Directories "/srv" >
ExpiresDefault "access 1 days"
<Files index.html>
ExpiresDefault "access 1 hours"
</Files>
</Directories>
<Directories "/srv/*" >
ExpiresDefault "access 1 days"
</Directories>
首先将每个文件(index.html 除外)的过期时间设置为 1 天,然后再次将每个子目录的过期时间覆盖为 1 天。
还有更好的解决办法吗?
答案1
我有一个使用“if”指令的解决方案:
<If "%{REQUEST_FILENAME} == '%{DOCUMENT_ROOT}/index.html'">
ExpiresDefault "access plus 1 hours"
</If>
这在 .htaccess 中有效,但有点尴尬,因为条件的右侧必须包含 .htaccess 文件的路径,该路径应该是隐式的,等于包含 .htaccess 的目录。
另一种解决方案仅适用于中央配置文件,而不适用于 .htaccess:
<DirectoryMatch "^/srv/www-example-com/[^/]*$">
<Files "index.html">
ExpiresDefault "access plus 1 hours"
</Files>
</DirectoryMatch>
请注意正则表达式的奇怪结尾。Apache 将完整的 URL 路径与包含文件名的正则表达式进行比较 - 而不是仅比较与 URL 匹配的目录名称!这可能是 Apache 错误,我的 Apache 版本是 2.4.18(Ubuntu 16.04)。通常这无关紧要,因为目的是匹配目录和子目录,因此使用前缀匹配,表达式末尾没有 $。
这种行为甚至可能很有用,因为 DirectoryMatch 实际上也可以匹配特定文件。但是 index.html 的情况并非如此,因为 index.html 的 URL 可以是 example.com/ 和 example.com/index.html,有时也可能是没有斜杠的 example.com(如果 DirectorySlash 关闭)。