Apache和mod_proxy不处理HTTP 100-从客户端继续HTTP 417

问题描述:

'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 

任何人看到我要去哪里错了吗?

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