如何透過 HAProxy 進行不同網站間的圖檔共用

最近因為工作上有這個需要將二個網站的圖檔共用機制進行協同的處理,之前二個網站的商品圖檔是透過後台人員分別上版至二個不同 IDC 的圖檔後再分別進行最佳化大小處理縮圖,但光是商品的圖檔處理同步就是一個大問題,所以我就建議圖檔處理上應該有一個共同的對應能進行對應,並將這圖的存取透過 HTTP 30x 進行轉址至前面的 CDN 這樣才能有效利用與最佳化圖檔的存取,但程式員短期無人力進行圖檔處理轉址的事,所以我就透過 HAProxy 透過上面的 URL Rewrite 功能進行處理,重點設定如下:

# Clean the request and remove any existing header named X-Rewrite
http-request del-header X-REWRITE1
http-request del-header X-REWRITE2
http-request add-header X-REWRITE1 %[url] if { path_beg /ProductImage }
http-request add-header X-REWRITE2 %[url] if { path_beg /XML }
http-request replace-header X-REWRITE1 ^/ProductImage/([0-9]{5})/0([0-9]{7})/(.*).jpg /NXimg/01/2/3_XXL.jpg if { hdr_cnt(X-REWRITE1) gt 0 }
http-request replace-header X-REWRITE2 ^/XML/B2Bcontent/QQQB2B/([0-9]{5})/0([0-9]{7})/(content)/(.*) /BBCont/01/2/4 if { hdr_cnt(X-REWRITE2) gt 0 }
http-request redirect code 302 location http://%[hdr(host)]%[hdr(X-REWRITE1)]  if {hdr_cnt(X-REWRITE1) gt 0 }
http-request redirect code 302 location http://%[hdr(host)]%[hdr(X-REWRITE2)]  if {hdr_cnt(X-REWRITE2) gt 0 }

 
上面的 設定主要是將 URL Request 的部份在 HAProxy 中透過 URL Rewrite 將 Request 的 A1 => B1 或 A2 => B2
A1: http://www.def.com.tw/ProductImage/01844/01844695/1844695-1.jpg
B1: http://media.abc.example.com/Nximg/001844/1844695/1844695-1_XXL.jpg

1.URL Path “ProductImage” => “NXimg”
2.一階商品碼(5位數=>6位數) 前補零 “/01844” => “/001844”
3.二階商品碼(8位數=>7位數) “/01844695” => “/1844695”
4.圖檔名加入尺寸 “/1844695-1.jpg” => “/1844695-1_XXL.jpg”

A2: http://www.def.com.tw/XML/B2Bcontent/QQQB2B/01844/01844695/content/5b4c210a-99a2-457d-9b25-5ea51287b961.jpg
B2: http://media.abc.example.com/BBCont/001844/1844695/5b4c210a-99a2-457d-9b25-5ea51287b961.jpg

1.URL Path “/XML/B2Bcontent/QQQB2B” => “/BBCont”
2.一階商品碼(5位數=>6位數) 前補零 “/01844” => “/001844”
3.二階商品碼(8位數=>7位數) “/01844695” => “/1844695”
4.去除三階型態別目錄 “/content”

另外,若是要測試及寫 RegEx 可以透過下列這個網站來線上測試
https://regex101.com

Author: