2010-10-08 116 views
9

'm建立一些webby魔術,並使用Apache前面我們的tomcat服務器,轉發請求到端口8080上的tomcat。我有一個問題,使用Apache和mod_proxy轉發要求。看起來,客戶端(一個Web應用程序)發送一個HTTP 100-繼續,Apache以417期望失敗響應。Apache和mod_proxy不處理HTTP 100-從客戶端繼續HTTP 417

當我將Apache從圖片中直接發送到端口8080上的tomcat時,請求成功,客戶端發送200 OK。

我的Apache的配置是這樣的:

服務器名abcproxy 的DocumentRoot /應用/ Apache的內容/默認

AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript text/xml 

BrowserMatch ^Mozilla/4 gzip-only-text/html 
BrowserMatch ^Mozilla/4\.0[678] no-gzip 
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 

ExpiresActive on 
ExpiresDefault "access 0 seconds" 

ProxyPass/http://127.0.0.1:8080/ 
ProxyPassReverse/http://127.0.0.1:8080/ 

     ProxyPreserveHost On 

CustomLog /apps/ocp-logs/apache/abcproxy.log combined 

任何人看到我要去哪裏錯了嗎?

回答

24

Apache在Expect頭文件中有一個已知和未解決的問題,請參閱bug 46709bug 47087

問題是某些客戶端設置了Expect頭,並且只在數據的PUT或POST之前發送請求頭。這允許服務器在客戶端發送請求主體(PUT或POST數據)之前響應錯誤/重定向/安全違規。這是一個值得稱讚的目標,但顯然客戶端並沒有等到它得到響應,而是推出了請求的主體,這導致了417錯誤。

如果您可以控制.NET客戶端,則可以使用ServicePointManager.Expect100Continue Property設置爲false來覆蓋此行爲。

如果您只能控制服務器,那麼您可以強制HTTP 1.0用於這些客戶端(可能基於用戶代理字符串),也可以強制在請求中儘早使用mod_header取消使用mod_header的Expect標頭。

要刪除請求的期待頭早使用mod_headers中使用這個配置指令:

<IfModule mod_headers.c> 
RequestHeader unset Expect early 
</IfModule> 

這工作,因爲客戶實際上不等待「100繼續」響應,並充當如果期望頭沒有設置。

+0

很好的共享,thanx – no9 2014-10-06 11:52:23

+0

確切地說,很好,你提到的.NET客戶端,這可以通過將Expect100Continue屬性設置爲false來解決。但是我們通過從Apache中刪除Expect頭來添加它 – 2018-02-12 09:56:14