【问题标题】:Apache FilesMatch - matching a folder in the regular expressionApache FilesMatch - 匹配正则表达式中的文件夹
【发布时间】:2010-10-26 11:14:17
【问题描述】:

我正在尝试使用 Apache2 的 .htaccess 文件缓存一些文件。我想缓存一个特定的文件夹比其他任何东西都长,所以我一直在尝试像这样使用 FilesMatch 指令:

<FilesMatch "skins(.*)\.(jpg|png|gif)">
ExpiresDefault A2592000
</FilesMatch>

我希望能够缓存 /skins/ 目录及其子目录中的所有图像文件。但是,我不能完全让正则表达式工作 - Apache 完全忽略了它。

如何在 .htaccess 文件中匹配带有&lt;FilesMatch&gt; 的文件夹?

干杯,
马特

【问题讨论】:

    标签: regex apache .htaccess mod-expires


    【解决方案1】:

    DirectoryLocation 命令在许多共享主机上的 .htaccess 中不起作用。解决方案是在目标子文件夹中创建.htaccess,并在那里使用FilesMatch命令。

    【讨论】:

    • 我感觉自己就像一个白痴整天都在尝试这样做...阅读您的回复,就像 DUH!就这么简单。谢谢!
    【解决方案2】:

    FilesMatch 应该只匹配文件名。您可以将.htaccess 文件放在skins 目录中,它应该如下所示:

    <FilesMatch "\.(jpg|png|gif)">
        ExpiresDefault A2592000
    </FilesMatch>
    

    或者,在httpd.conf 中,您可以使用:

    <Directory path_to_the_skins_dir>
        <FilesMatch "\.(jpg|png|gif)">
            ExpiresDefault A2592000
        </FilesMatch>
    </Directory>
    

    祝你好运。

    【讨论】:

    • 非常感谢您的帮助。我将使用多个 .htaccess 文件来保存更改主 httpd.conf。再次感谢,马特
    【解决方案3】:

    &lt;Directory&gt;&lt;Location&gt; 在 .htaccess 中是不允许的,但是……

    您可以使用&lt;If&gt; 哪个is allowed also in the “Context“ .htaccess(不仅仅是httpd.conf)......也可以使用see here。它允许你匹配一个基本路径一个扩展和其他任何东西,一个正则表达式可以掌握......

    经过测试和工作:

    <If "%{REQUEST_URI} =~ m#^/_stats/.*\.(jpg|png|css|js)#">
        Header unset ETag
        FileETag None
    
        ExpiresActive On
        ExpiresDefault "access plus 1 day"
    </If>
    

    注意事项: _stats 是我的重写 url,而不是传入的 URL(如果这对您有任何影响),不确定,为什么匹配对它起作用......

    # 只是在“”之外的一个不同的地方表示正则表达式,而不是使用/ 将其标记为正则表达式。 (因为我需要使用字面意义上的/,这让我不必逃避/'s)。

    【讨论】: