перенаправление URL-адреса запроса nginx

#nginx #dns #reverse-proxy #nginx-location

#nginx #dns #обратный прокси #nginx-местоположение

Вопрос:

У меня есть обратный прокси-сервер nginx, куда я хочу направлять все запросы, которые поступают с :

http://dns.com/content/xyz <—to—> http://dns.com/content/1.0/xyz

У меня есть восходящий :

 upstream backend_api.content.com {
        server localhost:8080 max_fails=5 fail_timeout=30;
        keepalive 100;
  }
  

и местоположение :

 #Content Service
location ~* ^/content/?(.*) {
     set $proxy_pass "http://backend_api.content.com";
     rewrite ^/content/1.0(/.*)$ /content/1.0$1 break;
     proxy_pass $proxy_pass
     proxy_http_version 1.1;
     proxy_set_header Connection "";
     proxy_set_header  X-Real-IP  $remote_addr;
     proxy_set_header  Host "api.stg.xxx.com";
     proxy_set_header X-3scale-proxy-secret-token $secret_token;
     proxy_set_header Original-Host $http_host;
     proxy_set_header Authorization $outbound_auth_header;
     proxy_set_header Original-Uri $scheme://$http_host$uri;
     post_action /out_of_band_oauth_authrep_action;
    }
  

но, похоже, что-нибудь с http://dns/content/xyz терпит неудачу и только тогда, когда я даю http://dns/content/1.0/xyz работает ли это?

Ответ №1:

Похоже, вы фиксируете часть URI в location ~* ^/content/?(.*) инструкции, но ничего с этим не делаете.

У вас также есть rewrite ^/content/1.0(/.*)$ /content/1.0$1 break; оператор, который ничего не делает, он просто записывает тот же URI обратно.

Быстрым и грязным решением может быть использование двух rewrite подобных инструкций:

 rewrite ^/content/1.0(/.*)$ /content/1.0$1 break;
rewrite ^/content(/.*)$ /content/1.0$1 break;
  

Это означает, что все, что не соответствует первой (не) перезаписи, будет обработано второй и будет /1.0 вставлено.

Лично мне это не нравится, и я предпочел бы использовать два блока местоположения:

 location /content/1.0 {
    set $proxy_pass "http://backend_api.content.com";
    proxy_pass $proxy_pass;
    proxy_http_version 1.1;
    proxy_set_header ...
    ...
}
location /content {
    rewrite ^/content(/.*)$ /content/1.0$1 last;
}
  

Но проверьте порядок вычисления других ваших location блоков. Обратите внимание, что блоки расположения префиксов и блоки расположения регулярных выражений имеют разные правила оценки. Подробности см. В Этом документе.