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

Необязательные сегменты URL в NGINX

Мне нужно передать несколько сегментов прокси на другой сервер, может быть до двух 5 сегментов.

С чем должен соответствовать nginx

Прямо сейчас код ниже, соответствует только

Для этого у нас есть этот блок кода:

location ~* ^/([a-z0-9]+)/?$ {
  proxy_pass http://@tds/direct/$1?$args;
  proxy_set_header Referer $http_referer;
  proxy_set_header X-Original-Host $server_name;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
  proxy_redirect off;
}

location ~* ^/([a-z0-9]+)/([A-Za-zА-Яа-я0-9\-\_\[\]\{\}\.]+)/?$ {
  proxy_pass http://@tds/direct/$1/$2?$args;
  proxy_set_header Referer $http_referer;
  proxy_set_header X-Original-Host $server_name;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
  proxy_redirect off;
}

Но теперь может быть до 5 сегментов, одно из решений состоит в том, чтобы добавить еще 4 местоположения, например, для 5 сегментов местоположение будет выглядеть примерно так:

location ~* ^/([a-z0-9]+)/([A-Za-zА-Яа-я0-9\-\_\[\]\{\}\.]+)/([A-Za-zА-Яа-я0-9\-\_\[\]\{\}\.]+)/([A-Za-zА-Яа-я0-9\-\_\[\]\{\}\.]+)/([A-Za-zА-Яа-я0-9\-\_\[\]\{\}\.]+)/([A-Za-zА-Яа-я0-9\-\_\[\]\{\}\.]+)/?$ {
  proxy_pass http://@tds/direct/$1/$2/$3/$4/$5?$args;
  proxy_set_header Referer $http_referer;
  proxy_set_header X-Original-Host $server_name;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
  proxy_redirect off;
}

Но это действительно выглядит дрянным решением, и, учитывая, что ссылка также может выглядеть как example.com/somehash/landing/5/segment1/segment2/segment3/segment4/segment5

Это даже более неприятное решение, потому что при таком подходе будет около 12 локаций.

Сегменты, передаваемые прокси на другой сервер, будут выглядеть точно так же, как и с одним сегментом, поэтому с 5 сегментами это будет выглядеть примерно так @ tds / direct / 1 доллар / 2 доллара / 3 доллара / 4 доллара / 5 долларов / 6 долларов (где $ 1 - это somehash, а от 2 до 6 - необязательные сегменты)

Есть ли правильный способ сделать это?

Заранее спасибо.

Что не так с простым location?

location / {
  proxy_pass http://@tds/direct/;
  proxy_set_header X-Original-Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
  proxy_redirect off;
}

Это будет прокси-запрос http://example.com/hash/a/b/c?a=1 к http://@tds/direct/hash/a/b/c?a=1 для любого URI.

Видеть http://nginx.org/r/proxy_pass

Если proxy_pass директива указывается с URI, затем, когда запрос передается на сервер, часть нормализованного URI запроса, соответствующая местоположению, заменяется URI, указанным в директиве

P.S. Нет необходимости использовать proxy_set_header для $http_ переменные. По умолчанию они передаются. Также X-Real-IP и X-Forwarded-For избыточны.