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

DrP*_*Pep 11 apache proxy

我正在构建一些webby魔法并使用Apache来支持我们的tomcat服务器,将请求转发到端口8080上的tomcat.我有一个问题,使用Apache和mod_proxy来转发请求.看起来客户端(Web应用程序)发送HTTP 100-continue,Apache以417 Expectation Failed响应.

当我将Apache从图片中取出并在端口8080上直接向tomcat发送请求时,请求成功并且客户端被发送200 OK.

我的Apache配置如下:

ServerName abcproxy DocumentRoot/apps/apache-content/default

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
Run Code Online (Sandbox Code Playgroud)

谁知道我哪里出错了?

lam*_*cck 29

Apache有一个已知且未解决的Expect标题问题,请参阅错误46709错误47087.

问题是某些客户端设置了Expect标头,并且只在PUT或POST数据之前发送请求标头.这允许服务器在客户端发送请求主体(PUT或POST数据)之前响应错误/重定向/安全违规.这是一个值得称赞的目标,但显然,客户端不会等到它得到响应并且只是推出请求的主体,这会导致417错误.

如果您可以控制.NET客户端,则可以将ServicePointManager.Expect100Continue属性设置为false,以覆盖此行为.

如果您只能控制服务器,看起来您可以为这些客户端强制使用HTTP 1.0(可能基于用户代理字符串),或者在请求的早期使用mod_header强制取消设置Expect标头.

要使用mod_headers尽早从请求中删除Expect标头,请使用以下config配置:

<IfModule mod_headers.c>
RequestHeader unset Expect early
</IfModule>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为客户端实际上并没有等待"100 Continue"响应,并且就像没有设置Expect标头一样.