Синтаксис RE2 с отрицательным просмотром регулярных выражений, используемый Caddy

При переводе моей конфигурации 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 17.04.2023 16:45

Спасибо, да, думаю, тогда я просто ограничусь вторым регулярным выражением.

obeN 17.04.2023 17:03

@InSync Я нахожусь в аналогичной ситуации при использовании веб-сайта SourceGraph, который, похоже, использует GoLang с его синтаксисом RE2 для регулярных выражений. Вы использовали инструмент для создания этого регулярного выражения или делали это вручную? Выглядит довольно сложно.

snoob dogg 20.04.2023 09:55

@snoobdogg Это вопрос? Если это так, пожалуйста, напишите это как вопрос, а не комментарий.

InSync 20.04.2023 09:58

@InSync, это вопрос о вашем комментарии...

snoob dogg 20.04.2023 10:09

@snoobdogg Во время комментирования я не видел отредактированную версию, извините. Я использовал функцию, которая выглядит так (JS): escape = s => s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')/polyfill = s => [...s].reverse().reduce((p, c) => `(?:${escape(c)}${p}|[^${escape(c)}][^/\\n]*)?`, '[^/\\n]+'). Однако это не гарантирует отказоустойчивость.

InSync 20.04.2023 10:14

@InSync, рассмотрите возможность публикации его как ответа на связанный повторяющийся вопрос. Я считаю, что это может быть полезно для будущих поколений.

markalex 20.04.2023 10:19

@markalex Я не знаю Go, поэтому я не могу просто опубликовать ответ с помощью этой функции JS и сказать: «Эй, ты знаешь, что ты можешь использовать эту мою изящную функцию JavaScript для создания регулярного выражения Go, а затем вставить его в ваш код?".

InSync 20.04.2023 10:25

@InSync, почему бы и нет? Не все, кто читает этот вопрос, используют Go: текущий вопрос является примером (и я думаю, что это не первый и даже не сотый вопрос, закрытый как его дубликат). Но у всех есть браузер и возможность один раз сгенерировать такое выражение.

markalex 20.04.2023 10:30
Опубликовано.
InSync 20.04.2023 14:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Невозможно использовать одно регулярное выражение, если отрицательный просмотр не поддерживается. Это не то, что делают регулярные выражения, кроме как обойти это, используя синтаксис отрицательного просмотра, поэтому, если это не поддерживается, то это невозможно.

Другие вопросы по теме