Rewrite

如何在 HAProxy 中用子域重寫 url

  • November 18, 2016

當使用者請求http://sub1.example.com/a/b/c我需要將此請求的主機名標頭替換為 example.com 並重寫http://example.com/sub1/a/b/的路徑丙。我嘗試使用 reqrep 但找不到如何將子域部分添加到路徑中。

reqirep ^Host:\ (.*[^\.])(\.example\.com)      Host:\ example.com
reqrep ^([^\ :]*)\ (.*) \1\ /???/\2

我發現 %

$$ req.hdr(host),lower,field(1,’.’) $$獲取子域名的方法,但我不能在 reqrep 方法的替換部分中使用它。如何在這部分使用變數?

將子域擷取到一個名為的請求變數req.rewrite_example中(這是我剛剛編造的一個名稱……req.是必需的,其餘的可以是任何你想要的)……通過擷取Host:標頭的值,將其轉換為小寫來做到這一點,然後使用regsub()轉換器.example.com在最後擦掉。僅當主機名以.example.com– 結尾時才這樣做,否則變數未定義並且-m found後續規則中的測試將是錯誤的並且這些規則不會觸發(這是我們想要的,對於我們可能看到的任何其他域名)。

http-request set-var(req.rewrite_example) req.hdr(host),lower,regsub(\.example\.com$,) if { hdr_end(host) -i .example.com }

如果定義了變數(如果第一個規則匹配,則應該是),將擷取的變數插入路徑的開頭。

http-request set-path /%[var(req.rewrite_example)]%[path] if { var(req.rewrite_example) -m found }

如果定義了變數,則Host:用文字字元串替換標題。example.com

http-request set-header Host example.com if { var(req.rewrite_example) -m found }

…發送請求…

curl http://www.example.com/tacgnol.jpg

…並且以下標頭正在發送到後端:

GET /www/tacgnol.jpg HTTP/1.1
User-Agent: curl/7.35.0
Accept: */*
Host: example.com

完畢。

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