簡體   English   中英

nginx - 根據查詢參數代理到不同的后端

[英]nginx - Proxy to a different backend based on query param

我有一個案例,我想根據查詢參數的存在將特定調用代理到不同的后端。 以下是我開始的內容

location ~ ^/abc/xyz/?$ {
    proxy_pass $backend_url;
 }

我想要做的是檢查查詢參數 foo (甚至只是該字符串在任何地方的存在)。 所以我想我可以做到這一點

location ~ ^/abc/xyz/?$ {
    set $backend_url "somelocation"

    if ($request_url ~ .*foo.*) {
       set $backend_url "someotherlocation"
       proxy_pass $backend_url
    }
    proxy_pass $backend_url;
 }

但這似乎並沒有真正代理到新位置。 我的代碼做錯了什么,還是整個方法都錯了?

我不知道你為什么使用兩個proxy_pass指令,這個塊應該按照你描述的邏輯來做:

location ~ ^/abc/xyz/?$ {
    set $backend_url "somelocation";
    if ($request_url ~ \?(.*&)?foo(=|&|$)) {
       set $backend_url "otherlocation";
    }
    proxy_pass $backend_url;
 }

我稍微修改了您的正則表達式以僅匹配請求 URL,其中foo是查詢參數名稱而不是查詢參數值(或其部分)。 但是我更願意為此使用map指令(map 塊應該放在 server 塊之外):

map $arg_foo $backend_url {
    ""      somelocation;  # if the value is empty
    default otherlocation; # otherwise
}

server {
    ...
    location ~ ^/abc/xyz/?$ {
        proxy_pass $backend_url;
    }
}

請注意,您可能需要為此配置定義resolver才能工作(有關此的一些附加信息可以在此處找到)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM