Я пытаюсь заставить эти 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
заголовок на основе первоначальный запрос прежде чем переписывать.