我需要将多个段进一步代理传递到另一台服务器,最多可以有两个 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=1
到http://@tds/direct/hash/a/b/c?a=1
任何 URI。
看http://nginx.org/r/proxy_pass
如果
proxy_pass
指令中指定了 URI,那么当请求传递到服务器时,规范化请求 URI 中与位置匹配的部分将被指令中指定的 URI 替换
PS 没有必要使用proxy_set_header
for$http_
变量。它们默认被传递。而且X-Real-IP
和X-Forwarded-For
是多余的。