Apache FilesMatch - сопоставление папки в регулярном выражении

Я пытаюсь кэшировать некоторые файлы, используя файл .htaccess для Apache2. Я хочу кэшировать конкретную папку дольше, чем что-либо еще, поэтому я пытался использовать директиву FilesMatch следующим образом:

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

Я надеюсь, что вы сможете кэшировать все файлы изображений в каталоге/skins/и подкаталогах. Однако я не могу заставить регулярное выражение работать - Apache просто игнорирует его вообще.

Как вы сопоставляете папку с <FilesMatch> в файле .htaccess?

Cheers,
 Matt

Ответ 1

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>

Удачи.

Ответ 2

Команды Directory и Location не работают в .htaccess на многих хостингах. Решением может быть создание .htaccess в целевой FilesMatch и использование FilesMatch команды FilesMatch.

Ответ 3

<Directory> и <Location> запрещены в .htaccess, но...

Вы можете использовать <If> что также разрешено в "Context" .htaccess (не только httpd.conf)… также смотрите здесь. Он позволяет вам найти базовый путь, расширение и все остальное, что может понять RegExp…

Проверено и работает:

<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 (если это имеет какое-то значение с вашей стороны), я не уверен, почему сопоставление работает против этого…

# - это просто другой внешний "гейт", обозначающий регулярное выражение, вместо использования / чтобы пометить его как регулярное выражение. (Поскольку мне нужно использовать / в буквальном смысле этого слова, это избавляет меня от необходимости избегать /).