Nginx
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/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 替換PS 沒有必要使用
proxy_set_header
變數$http_
。它們預設通過。也X-Real-IP
和X-Forwarded-For
是多餘的。