Рейтинг:1

Предотвратить правило регулярного выражения Nginx для переопределения другого правила

флаг hm

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

местоположение /бэкэнд/service1 {
        proxy_pass http://pathto/service1;
}

место расположения / {
        корень /a/папка
}

расположение ~* (\.js|\.css)$
        истекает 8 дней;

        корень /home/files/abc/bcd;
}

Моя проблема в том, что в последнее время сервис1 из бэкэнда должен обслуживать пару статических файлов, таких как /backend/service1/что-то/file1.js или же /backend/service1/что-то/style.css и второе местоположение, поскольку это правило местоположения регулярного выражения, переопределяет первое

Все статические файлы, предоставляемые backend/service1, имеют определенный префикс (что-нибудь), поэтому я попытался улучшить регулярное выражение из второго места, чтобы иметь отрицательный просмотр вперед/обратный просмотр, но, похоже, это не работает, вероятно, потому, что основной шаблон должен иметь фиксированную длину (это то, что я пытался безуспешно)

местоположение /бэкэнд/service1 {
        proxy_pass http://pathto/service1;
}

место расположения / {
        корень /a/папка
}

расположение ~* (?<!что-то)(.*)(\.js|\.css)$
        истекает 8 дней;

        корень /home/files/abc/bcd;
}

Как я могу этого добиться?

флаг jp
https://nginx.org/en/docs/http/ngx_http_core_module.html#location
RabidTunes avatar
флаг hm
Я уже проверил документы, но, проверив их в третий раз, я пришел к решению, см. мой ответ ниже, так что, думаю, спасибо.
Рейтинг:3
флаг jp

Если "что-то" сразу следует /бэкэнд/сервис1, вы можете добавить еще один более конкретный место расположения это имеет приоритет над местоположениями регулярных выражений:

местоположение /бэкэнд/service1 {
    proxy_pass http://pathto/service1;
}  
местоположение ^~ /backend/service1/что-то/ {
    proxy_pass http://pathto/service1/something/;
}  
расположение ~* \.(js|css)$ { ... }

Если «что-то» встроено где-либо в URL-адресе, вам нужно будет использовать регулярное выражение, возможно, с пресловутый негативный прогноз. Методом проб и ошибок нашел рабочее выражение:

местоположение ~* ^(?!.*что-то).*\.(js|css)$ { ... }
Рейтинг:0
флаг hm

Я принял другой ответ, но что-то, что также сработало для моего случая, - это вложение местоположения, в котором было регулярное выражение. Что-то вроде этого

местоположение /бэкэнд/service1 {
        proxy_pass http://pathto/service1;
}

место расположения / {
        место расположения / {
            корень /a/папка
        }

        расположение ~* (\.js|\.css)$
            истекает 8 дней;

            корень /home/files/abc/bcd;
        }
}

Таким образом, если URI назначения имеет префикс /backend/service1, первое местоположение сработает, для любых других местоположений сработает / и тогда регулярное выражение может вступить в силу.

Richard Smith avatar
флаг jp
Это решение не отвечает на ваш вопрос. Это то же самое, что и использование `location ^~ /backend/service1`
RabidTunes avatar
флаг hm
Почему вы говорите, что это не отвечает на мой вопрос? Я исправил свою проблему, сделав это, это неправильно? Будут ли у меня проблемы в будущем?
RabidTunes avatar
флаг hm
Позже я попробую ваше решение, потому что оно проще, и если оно сработает, я приму ваш ответ в пользу своего, но на самом деле я исправил свою проблему с помощью своего подхода, поэтому я не понимаю ваш комментарий
Richard Smith avatar
флаг jp
Я не говорю, что это не решит вашу проблему, и хорошо, что вы нашли решение, которое вам подходит. Но вопрос, который вы отправили в SF, конкретно касался определенного префикса «что-то», и этот ответ не касается этого.
RabidTunes avatar
флаг hm
Ваше решение работает, и оно проще, поэтому я принял его и отредактировал, спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.