2013-10-14 28 views
0

我有一臺nginx服務器負載均衡幾個express(node.js)服務器。每當我在查詢表單上獲得未編碼的空白請求時關閉連接,nginx認爲它已關閉。然後它向下一個快速上游發出相同的請求,獲得相同的結果,並因此設置整個集羣,當沒有任何事情真的停止時。在nginx上的URL查詢中重寫空格(使用快遞)

望着日誌,這些請求都從舊的瀏覽器,如Mozilla 4.未來我也可以效仿,捲曲的行爲:

curl "http://mysite.com/path/?q=foo bar" 

我已經嘗試添加重寫規則與各種正則表達式使用%20編碼該空格:

rewrite  "^(.*)\ (.*)$" "$1%20$2" last; 
rewrite  "^(.*)\s(.*)$" "$1 $2" last; 
rewrite  "\s" "%20" last; 
... 

但似乎沒有任何工作。這是我的正則表達式的問題還是隻是nginx不允許只是切換一個字符? 你是否知道解決問題的其他方法?也許在express/node級別,爲了避免它關閉連接?

回答

1

在仔細研究之後,我不認爲nginx是完成這項任務的最佳工具。你不能在沒有使用perl模塊的情況下替換所有的事件(如果我錯了,糾正我)。

這些請求不符合HTTP,因此您拒絕這些請求是正確的。

如果絕對想接受他們,你仍然可以用做只是Node.js的:

的HTTP分析器通過http._connectionListener暴露。此函數採用TCP套接字,解析動詞,查詢和標題併發出事件(傳遞給createServer的函數會自動偵聽)。

在你的情況下,函數從不觸發事件,但在你做任何其他事情之前關閉連接。

你可以劫持它的HTTP解析器看到它之前重寫請求:

var util = require('util'), 
    http = require('http'); 

var oldConnectionListener = http._connectionListener; 

http._connectionListener = function (connection) { 
    var cleaner = new QueryCleaner(connection); 

    oldConnectionListener(cleaner); 
}; 

QueryCleaner將是重寫查詢,如果不正確,然後通過傳送流的其餘部分流。

+0

是的,我做到了。它也不起作用。這個問題似乎只是取代url的查詢部分的字符。例如,如果我嘗試替換字符'a',它會替換路徑中的a,而不是查詢中的a。它是否提供任何線索? –

+0

它只是無法替代%20,因爲它編碼後的結果。我的意思是,在應用正則表達式之後,它將用%25更改%,結果是%2520。 –

+1

好吧,我明白了。你可以使用$ args變量來做到這一點。 –