При переводе моей конфигурации Apache и Nginx в Caddyfile у меня возникла проблема с регулярным выражением. Я использую в Apache следующее, чтобы ограничить доступ к файлам и каталогам, которые начинаются с точки (.
) и не находятся в каталоге .well-known
.
<IfModule mod_authz_core.c>
<LocationMatch "(^|/)\.(?!well-known/)">
Require all denied
</LocationMatch>
</IfModule>
Это блок конфигурации Apache, который использует модуль mod_authz_core
для запрета доступа к любым файлам или каталогам, начинающимся с точки (.
) в запрошенном URL-адресе, за исключением тех, которые находятся в каталоге .well-known
:
@block {
path_regexp ^(/\..*)$
not path_regexp "^/\.well-known/.*$"
}
respond @block 403
Однако я хотел бы использовать одно регулярное выражение без использования not path_regexp
.
Проблема заключается в отрицательном синтаксисе просмотра вперед в регулярном выражении. Синтаксис RE2, используемый Caddy, не поддерживает синтаксис (?!pattern)
для отрицательного просмотра вперед.
Теперь я застрял, даже прочитав предыдущие вопросы по этой проблеме, я не могу понять, как это решить. Есть идеи?
Если вам интересно, эквивалент Nginx:
location ~* /\.(?!well-known/) {
deny all;
}
Спасибо, да, думаю, тогда я просто ограничусь вторым регулярным выражением.
@InSync Я нахожусь в аналогичной ситуации при использовании веб-сайта SourceGraph, который, похоже, использует GoLang с его синтаксисом RE2 для регулярных выражений. Вы использовали инструмент для создания этого регулярного выражения или делали это вручную? Выглядит довольно сложно.
@snoobdogg Это вопрос? Если это так, пожалуйста, напишите это как вопрос, а не комментарий.
@InSync, это вопрос о вашем комментарии...
@snoobdogg Во время комментирования я не видел отредактированную версию, извините. Я использовал функцию, которая выглядит так (JS): escape = s => s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
/polyfill = s => [...s].reverse().reduce((p, c) => `(?:${escape(c)}${p}|[^${escape(c)}][^/\\n]*)?`, '[^/\\n]+')
. Однако это не гарантирует отказоустойчивость.
@InSync, рассмотрите возможность публикации его как ответа на связанный повторяющийся вопрос. Я считаю, что это может быть полезно для будущих поколений.
@markalex Я не знаю Go, поэтому я не могу просто опубликовать ответ с помощью этой функции JS и сказать: «Эй, ты знаешь, что ты можешь использовать эту мою изящную функцию JavaScript для создания регулярного выражения Go, а затем вставить его в ваш код?".
@InSync, почему бы и нет? Не все, кто читает этот вопрос, используют Go: текущий вопрос является примером (и я думаю, что это не первый и даже не сотый вопрос, закрытый как его дубликат). Но у всех есть браузер и возможность один раз сгенерировать такое выражение.
Невозможно использовать одно регулярное выражение, если отрицательный просмотр не поддерживается. Это не то, что делают регулярные выражения, кроме как обойти это, используя синтаксис отрицательного просмотра, поэтому, если это не поддерживается, то это невозможно.