NGINX 中的可选 URL 段

NGINX 中的可选 URL 段

我需要将多个段进一步代理传递到另一台服务器,最多可以有两个 5 个段。

nginx 需要匹配什么

  • 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

目前,以下代码仅匹配

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

为此,我们有以下代码块:

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/直接/$1/$2/$3/$4/$5/$6(其中 $1 为“somehash”,2 至 6 为可选段)

有没有正确的方法来做到这一点?

先感谢您。

答案1

简单有什么问题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=1http://@tds/direct/hash/a/b/c?a=1任何 URI。

http://nginx.org/r/proxy_pass

如果proxy_pass指令中指定了 URI,那么当请求传递到服务器时,规范化请求 URI 中与位置匹配的部分将被指令中指定的 URI 替换

PS 没有必要使用proxy_set_headerfor$http_变量。它们默认被传递。而且X-Real-IPX-Forwarded-For是多余的。

相关内容