Nginx

NGINX 中的可選 URL 段

  • May 28, 2014

我需要代理將多個段進一步傳遞到另一台伺服器,最多可以有兩個 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/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=1http://@tds/direct/hash/a/b/c?a=1任何 URI 的請求。

http://nginx.org/r/proxy_pass

如果proxy_pass指令是用 URI 指定的,那麼當請求被傳遞到伺服器時,與位置匹配的規範化請求 URI 的部分將被指令中指定的 URI 替換

PS 沒有必要使用proxy_set_header變數$http_。它們預設通過。也X-Real-IPX-Forwarded-For是多餘的。

引用自:https://serverfault.com/questions/599092