Http

正則表達式辨識 URL 參數不知道它將是哪個參數

  • August 21, 2018

所以我一直在努力建構一個 haproxy 集群(1.5.x)並遇到了一個障礙,對於一個特定的 web 應用程序,我想將 API GETs 推向一個只讀應用程序集群,並將 PUTs 推向一個更小的寫入集群.

我試過使用path_reg,它似乎不想匹配文件名之外的任何內容。urlp 衍生物似乎是我應該使用的,但它們的正確用法卻讓我望而卻步。我試圖擷取和區分的 URL 參數的一個棘手的細微差別都以“獲取”或“設置”某些東西開頭……但參數沒有值。根據我的理解或嘗試,urlp 派生詞通常期望有一個與參數關聯的值,所以看起來我不能簡單地使用類似的東西:

acl api_gets urlp_reg(get) (get?){1}

來自帶有以下參數的 URL:

/api.foo?apikey=stuff&param1=foo&getsomething&param2=bar

同樣,path_reg似乎除了文件名之外什麼都沒有,因此嘗試匹配以下內容作為概念證明的基本測試也沒有結果:

acl path_sanity_check path_reg ^\/api\.foo\?apikey.*

而簡單地製作正則表達式模式*^/api.foo*將獲取請求發送到的位置。

即使參數沒有值,我*是否應該為此使用 urlp_reg ?*如果不使用 urlp 導數,還有哪些替代方案?

路徑獲取路徑。查詢不是路徑的一部分。 capture.req.uri獲取完整的 URI。

儘管草率,但您可以將其與以下內容相匹配:

acl foo capture.req.uri -m reg [&\?]get

字元類轉義可能需要調整,但想法是在請求 URI 中查找?get或查找。&get

如果您正在建構一個新集群,請使用 HAProxy 1.6,它具有許多新的、有用的獲取和轉換器,以及用於更複雜邏輯的可選 Lua 集成。

urlp_reg是錯誤的解決方案,因為正則表達式匹配的是參數的,而不是它的名稱……而且你沒有值。

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