如何将 ExpiresDefault 指令应用于单个文件,排除 Apache 2.4 中子目录中的类似文件

如何将 ExpiresDefault 指令应用于单个文件,排除 Apache 2.4 中子目录中的类似文件

我必须将根目录 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 关闭)。

相关内容