2015-10-28 65 views
1

我想編寫一個haproxy規則,當URL包含未編碼字符時將返回一個400錯誤的請求錯誤消息。這些不好的字符在我的應用程序中導致服務器錯誤,並最終導致內存不足的錯誤,並且在通關時將它們發送出去會很好。如何根據URL中的未編碼字符使用HAProxy返回400錯誤?

正確的方法(我知道)是解決這個問題在服務器端,但由於很多愚蠢的原因,我現在無法更改該代碼。

我想,我需要這樣的東西

acl bad_char path_reg [(badcharsethere)] 

,但我找不到什麼重定向到400錯誤會是什麼樣子的例子。

回答

3

創建一個虛假的後端,並將其503(服務不可用)靜態HTTP響應文件配置爲指向您將用作固定響應的文件,然後使用該後端爲這些請求提供服務。客戶端看到的錯誤代碼僅由靜態文件中的內容決定。複製其中一個示例錯誤文件,並記住它們是原始HTTP響應,因此您需要在每個標頭的末尾有\r\n,並且在標頭的末尾需要有\r\n\r\n

use_backend bogus if bad_char 

backend bogus 
    errorfile 503 /etc/haproxy/errors/400badchar.http 

當ACL匹配,HAProxy的將嘗試使用僞造的後端,它沒有服務器,所以HAProxy的將嘗試返回一個503,這將回報您的定製響應文件,您將有修改爲返回一個自定義的400錯誤。

+0

哦,這太酷了!謝謝! – esperluette

+0

我很高興你喜歡它。附:你應該真的修復你的服務器。 :)但是在我看來,還有另一個可能很酷的選項,在HAProxy 1.6中使用Lua ......你可以編寫一個小的Lua函數來替換僞造的字符,並返回一個重定向到瀏覽器或者用「更正」的URI '位置:'標題。或者你可以用Lua的'string.gsub()'按摩請求,然後HAProxy會以「更正」的形式將它轉發到服務器。 –

+0

這是個好主意。 :-)(固定服務器和Lua替換函數) – esperluette

相關問題