Назад | Перейти на главную страницу

Apache 2: Negative FilesMatch / FilesNotMatch

Если я хочу применить правило только к некоторым файлам в apache2.conf, я могу использовать <FilesMatch>.

Например:

<FilesMatch ".(gif|jpg|jpeg|png|mpg|avi)$">
    deny from env=hotlink
</FilesMatch>

Но есть ли противоположность FilesMatch, то есть FilesNotMatch?

Я хочу добиться:

<FilesMatch ".(gif|jpg|jpeg|png|mpg|avi)$">
    <FilesNotMatch "ban">
        deny from env=hotlink
    </FilesNotMatch>
</FilesMatch>

(запретить хотлинкинг всех изображений на сервере, НО баннеры)

Или у вас есть предложение, как я могу изменить свое регулярное выражение, чтобы оно не соответствовало чему-либо, содержащему слово «запрет»?

К сожалению, способа отменить совпадение файлов в Apache не представляется возможным.

Однако библиотека регулярных выражений, которую использует Apache, - это PCRE (Perl Compatible Regular Expressions). Это означает, что у вас есть все возможности регулярных выражений Perl, включая их утверждения отрицательного просмотра назад и вперед. Это довольно сложные и мощные функции. Я не могу быть уверен, что это сработает, особенно не зная полного макета ваших изображений, но вы можете использовать что-то вроде:

<FilesMatch "(?<!ban).*\.(gif|jpg|jpeg|png|mpg|avi)$">

Почти правильно - нужно использовать \b(?!.*ban.*)(.+)\.(gif|jpg|jpeg|png|mpg|avi)$ regexp для такого исключения.