2009-01-19 51 views
3

我建立一個Django的網站,並嘗試使用request.is_ajax()功能......但這只是工作本地,它的駕駛我瘋了!X-要求,隨着/ HTTP_X_REQUESTED_WITH奇怪的問題

我在剛纔傾倒標題的地方。這裏(在Django測試服務器上)有HTTP_X_REQUESTED_WITH,但在生產服務器上(cherokee + scgi),我所得到的全部是X-Requested-With

我用螢火蟲探聽發送的標題和它的X-Requested-With(在這兩個版本的網站上)。我很,非常困惑。任何人都可以解釋發生了什麼,以及我怎樣才能解決它而不會失去主意?

回答

3

wrt/X-Requested-With => HTTP_X_REQUESTED_WITH東西,它符合CGI規範。由於FastCGI,SCGI和WSGI都基於CGI規範,所以Django開發人員選擇遵循這個約定(FWIW,ModPythonRequest類爲了一致性進行相同的重寫)。

所以看來你的問題是,切諾基/ scgi鏈中的東西不能正確地重寫頭。你正在使用哪個scgi實現?

2

我目前正在圍繞這一問題正與中間件一點點,基本上查找「錯誤」的標題,如果它存在,追加同等價值的一個新的標題:

if 'X-Requested-With' in request.META: 
    request.META['HTTP_X_REQUESTED_WITH'] = request.META['X-Requested-With'] 

但我真的希望我知道這些標題應該會發生什麼,因爲總是發送X-Requested-With ......我不明白爲什麼應該將其翻譯爲HTTP_X_REQUESTED_WITH以及爲什麼它不是。

編輯:原因似乎是深入實際的Web服務器。

case 'X': 
    if (header_equals ("X-Forwarded-For", header_x_forwarded_for, begin, header_len)) { 
     ret = add_known_header (hdr, header_x_forwarded_for, val_offs, val_len); 
    } else if (header_equals ("X-Forwarded-Host", header_x_forwarded_host, begin, header_len)) { 
     ret = add_known_header (hdr, header_x_forwarded_host, val_offs, val_len); 
    } else 
     goto unknown; 
    break; 

我已經建檔的錯誤,以獲取添加我的頭,但應該所有的X *頭轉換成HTTP_X_ *頭?

+0

是的,我認爲這取決於Web服務器將HTTP標頭翻譯成SCGI環境。不知道SCGI應該如何發生(我使用WSGI),但這可能是切諾基的一個錯誤。 – 2009-01-20 02:18:19