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

Регулярное выражение местоположения Nginx не работает с прокси-сервером

Я пытаюсь заставить эти 2 директивы местоположения работать в Nginx, но при загрузке Nginx я получаю некоторые ошибки.

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

Я получаю вот такую ​​ошибку:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

Кому-нибудь это кажется знакомым? Что мне здесь не хватает?

Небольшое дополнение к отличному ответу от Xaviar:

Если вы не так хорошо знакомы с nginx, есть важное различие между добавлением косой черты в конец proxy_pass директива.

Последующий не работай:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

а вот этот:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

Разница в том, что / в конце proxy_pass директива.

Это говорит вам, что URI в директиве proxy pass не может использоваться в местоположении регулярного выражения. Это связано с тем, что nginx не может заменить часть URI, соответствующую регулярному выражению в location блок с тем, который прошел в proxy_pass директива универсальным способом.

Просто представьте, что ваше регулярное выражение местоположения /foo/(.*)/bar, и вы указываете proxy_pass http://server/test, nginx должен будет сопоставить ваше регулярное выражение местоположения с другим на более высоком уровне, потому что вы не хотите заканчивать /foo/test/bar/something но с /test/something. Так что изначально это невозможно.

Итак, для этой части должно работать следующее:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

Однако невозможно будет переписать перенаправления в соответствии с шаблоном URI блока местоположения, потому что он перезаписывает текущий обрабатываемый URI, что делает невозможным изменение Location заголовок на основе первоначальный запрос прежде чем переписывать.