Регекс розташування Nginx не працює з пропуском проксі


43

Я намагаюся повернути ці 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

Це комусь звучить знайомо? Що мені тут не вистачає?

Відповіді:


48

Невелике доповнення до чудової відповіді 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директиви.


1
Це /зафіксувало мою проблему з налаштуваннями, важко було впіймати, дякую!
Йорч

Водив мене горіхами, дякую, що вказав на це!
кирилиця

20

Це говорить вам про те, що URI у директиві пропуск проксі не може бути використаний у регулярному вираженні. Це тому, що 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заголовка на основі початкового запиту перед перезаписом.


2
переміщення контуру в правило переписання працювало на мене. Дякую.
sonjz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.