Альтернатива nginx для директивы proxy_pass в операторе if - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующая конфигурация NGINX:

- location /concepts {
  auth_basic "off";
  if ($http_accept ~ 'application/json') { set $isapirequest "true"; }
  if ($http_accept ~ 'application/ld\+json') { set $isapirequest "true"; }
  if ($http_accept ~ 'application/hal\+json') { set $isapirequest "true"; }
  if ( $isapirequest = "true" ) { proxy_pass http://127.0.0.1:5315/search/concepts/; }
  if ( $isapirequest != "true" ) {
  rewrite ^/concepts$ /concepts/ redirect;
  rewrite ^(.*)$ /blah$1 last;
  }
  include add_cors_headers_OPTIONS_HEAD_GET_PUT_DELETE;
  }

Ошибка, которую я получаю:

\"proxy_pass\" cannot have URI part in location given by regular expression, or inside named location, or inside \"if\" statement, or inside \"limit_except\"

Можете ли вы, ребята, придумать какой-нибудь способ достижения NGINXвыше, без использования оператора "if"?

1 Ответ

0 голосов
/ 21 сентября 2018

Ваши последние два if утверждения являются взаимоисключающими, поэтому один из них может быть исключен, что устранит полученную ошибку.

В этом документе указано, какие операторы должны бытьиспользуется внутри блока if в контексте location.Вы можете рассмотреть возможность использования map для замены всех операторов if, кроме одного.

Например:

map $http_accept $redirect {
    default                 1;
    ~application/json       0;
    ~application/ld\+json   0;
    ~application/hal\+json  0;
}

server {
    ...
    location /concepts {
        auth_basic "off";

        if ($redirect) {
            rewrite ^(.*)$ /blah$1 last;
        }
        proxy_pass http://127.0.0.1:5315/search/concepts;
        include add_cors_headers_OPTIONS_HEAD_GET_PUT_DELETE;
    }
    ...
}

Оператор rewrite ^/concepts$ /concepts/ redirect; можно переместить в location который обрабатывает /blah/concepts URI и переписывается как rewrite ^/blah/concepts$ /concepts/ redirect;.

См. этот документ для получения дополнительной информации.

...