Segmentos de URL opcionais no NGINX

1

Eu preciso de passar o proxy vários segmentos para outro servidor, pode haver até dois 5 segmentos.

O que o nginx precisa corresponder

  • example.com/somehash
  • example.com/somehash/segment1
  • example.com/somehash/segment1/segment2
  • example.com/somehash/segment1/segment2/segment3
  • example.com/somehash/segment1/segment2/segment3/segment4
  • example.com/somehash/segment1/segment2/segment3/segment4/segment5

Neste momento, o código abaixo corresponde apenas

  • example.com/somehash
  • example.com/somehash/segment1

Para isso, temos este bloco de código:

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;
}

Mas agora, pode haver até 5 segmentos, uma das soluções é basicamente adicionar mais 4 locais, por exemplo, para a localização de 5 segmentos seria algo como isto:

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;
}

Mas isso realmente parece uma solução de baixa qualidade, e considerando o link também pode parecer example.com/somehash/landing/5/segment1/segment2/segment3/segment4/segment5

Esta é uma solução ainda pior, pois com essa abordagem, haverá cerca de 12 locais.

Os segmentos de passagem de proxy para outro servidor ficarão exatamente da mesma forma que parecem com um segmento, portanto, com 5 segmentos, seria algo como isso @ tds / direct / $ 1 / $ 2 / $ 3 / $ 4 / $ 5 / $ 6 (onde $ 1 é 'somehash' e 2 a 6 são segmentos opcionais)

Existe uma maneira correta de fazer isso?

Obrigado antecipadamente.

    
por Screatch 28.05.2014 / 14:59

1 resposta

0

O que há de errado com o simples 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;
}

A solicitação de proxy será http://example.com/hash/a/b/c?a=1 para http://@tds/direct/hash/a/b/c?a=1 para qualquer URI.

Veja link

If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive

P.S. Não há necessidade de usar proxy_set_header para $http_ variables. Eles são passados por padrão. Também X-Real-IP e X-Forwarded-For são redundantes.

    
por 28.05.2014 / 15:06