2011-05-08 98 views
4
<VirtualHost *:80> 
    ServerAdmin [email protected] 
    DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" 
    ServerName dev.dom.com 
    ServerAlias dev.dom.com 
    ErrorLog "logs/dev.dom.com-error.log" 
    CustomLog "logs/dev.dom.com-access.log" common 
    PassEnv CLUSTER 
    Header always set X-Cluster "%{CLUSTER}e" 
</VirtualHost> 

這是我的配置。我有一個環境變量,它告訴我我在哪個集羣上,它作爲'X-Cluster'中的標題傳遞。這在200或404響應上返回正常,但304 Not Modified響應從不返回頭,即使它返回其他適當的Apache頭。304響應沒有爲mod_headers設置apache的自定義頭

如何獲得頭到304響應期間設置?

+0

遠投,但你找到了一個解決方案? – juan 2013-07-23 15:43:42

+0

http://stackoverflow.com/questions/17812347/how-to-add-a-custom-header-despite-a-rewriterule-redirecting-to-304 – juan 2013-07-23 15:48:11

回答

1

阿帕奇明確禁止在符合HTTP規範304響應修改所述響應標頭。這種類型的響應的名稱是「未修改」。您可以使用Apache的過濾器體系結構,通過編寫自定義模塊或使用mod_perl來修改此行爲,但這很可能是錯誤的。

7

根據目前的HTTP規範,一個304 Not Modified響應不應該返回實體頭(除了少數特定的例外)。從section 10.3.5 of RFC 2616報價:

如果有條件的習慣強大的緩存驗證,響應不應該包含其他實體頭。 否則(即,條件GET使用弱驗證器),響應絕不能包含其他實體頭;這可以防止緩存的實體和更新的標題之間的不一致。

不幸的是所有的擴展標頭是classified as entity headers

然而,展望未來,在旨在取代2616選秀HTTPbis規範,規則更爲寬鬆。從section 4.1 of the Conditional Requests spec引述:

由於304響應的目標是最小化的信息傳送 當接收者已經具有一個或多個高速緩存的表示,一個 發送者不應生​​成比 以上除非列出的字段其它表示的元數據所述元數據存在用於指導緩存更新的目的 。

因此,如果您設置的自定義標題不會被歸類爲表示元數據,那麼我希望在新規則下被認爲是合法的。

這就是說,無論什麼是寫在這些規範,你還是要處理一下Apache可以支持。根據我在源代碼中看到的,在304響應中仍然不支持自定義標頭。

其中頭被過濾的地方是在ap_http_header_filter函數的文件/modules/http/http_filters.c中:

更具體地,這樣的代碼:

if (r->status == HTTP_NOT_MODIFIED) { 
    apr_table_do((int (*)(void *, const char *, const char *)) form_header_field, 
       (void *) &h, r->headers_out, 
       "Connection", 
       "Keep-Alive", 
       "ETag", 
       "Content-Location", 
       "Expires", 
       "Cache-Control", 
       "Vary", 
       "Warning", 
       "WWW-Authenticate", 
       "Proxy-Authenticate", 
       "Set-Cookie", 
       "Set-Cookie2", 
       NULL); 
} 

當返回「未修飾的」響應(304 ),上述標題的列表是通過(其它讓比一些自動生成的標題,如:日期服務器)唯一的。從我所看到的情況來看,似乎並沒有一種簡單的方法來鉤入這些代碼來改變行爲。

的底線是,這仍然是不可能的Apache在當前時間。至少有one bug report請求支持其他頭文件,但這是專門用於CORS頭文件的。然而,如果運氣好的話,這可能會鼓勵他們更加開放地支持自定義標題。

但是,直到出現這種情況,唯一的解決辦法,我可以建議是給自己打補丁的服務器。如果你不想從源代碼重建,你甚至可以直接修補二進制文件。例如,如果你只需要支持一個或兩個新的標題,您可以取代一些你不太可能使用(例如設置-COOKIE2,這是過時反正)現有的頭。

只需搜索要在Apache bin目錄中替換的標頭名稱(在Windows上,您應該可以在libhttpd.dll中找到它們)。然後使用二進制編輯器將新的頭名替換爲空字符結尾的字符串(當然,它需要與您要替換的頭相同或更短)。

我不知道其他操作系統,但我測試過這在Windows和它似乎工作。這顯然是一個可怕的黑客,但如果你足夠絕望,你可能會認爲這是一個選擇。

相關問題