带有 p 标志的 Apache ProxyPass/RewriteRule:当响应具有多部分内容类型 ieimages 时不返回任何内容

带有 p 标志的 Apache ProxyPass/RewriteRule:当响应具有多部分内容类型 ieimages 时不返回任何内容

这是上一个问题只需稍作改动即可实现。下面是我要讲的结构。我的目标是创建隧道/代理。

                         port 80                                 port 6103

Website (shared hosting) ----------> Tunnel (Dedicated hosting)  -----------> RETS Server

我使用带有 P 标志的 RewriteRule(即 ProxyPass)来重写请求。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^rets/server/(.*)$ http://rets-server:6103/rets/server/$1 [P]
</IfModule>

它对几乎所有请求(到目前为止我做过的)都运行良好,除了响应内容类型为多部分(或图像)的请求。它给出响应 200 OK,内容长度为 0。

以下是我在不使用代理的情况下收到的响应

< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< RETS-Version: RETS/1.5
< cache-control: private
< Server: StratusRETS/1.7
< MIME-Version: 1.0
< Content-Type: multipart/parallel; boundary=StratusRETS-XYZZY;charset=utf-8
< Transfer-Encoding: chunked
< Date: Tue, 24 Jul 2012 15:05:12 GMT
< --StratusRETS-XYZZY
Content-ID: E2356878
Content-Type: image/jpeg
Description: E2356878
Object-ID: 1
....

以下是通过代理发出相同请求时的响应

< HTTP/1.1 200 OK
< Date: Tue, 24 Jul 2012 14:49:59 GMT
< Server: Apache-Coyote/1.1
< RETS-Version: RETS/1.5
< cache-control: private
< Content-Type: text/xml;charset=utf-8
< Content-Length: 0
< 

我也在 httpd.conf 中使用了 ProxyPass 和 ProxyPassReverse。但是,没有成功。

更新: 下面是使用和不使用代理来回发送的数据包的图像。ps 带有白色字体的黑线是从我的 IP(**.1.2)发送到 RETS 服务器(**5.47)的请求,并标记了请求的内容。

无需代理(工作正常) 无需代理(工作正常)

使用代理(不适用于图像) 使用代理(不适用于图像)

图像的请求标头如下(响应标头粘贴在上面。)

不使用代理

GET /rets-treb3pv/server/getobject?Resource=Property&Type=Photo&ID=E2356878%3A%2A&Location=0 HTTP/1.1
Authorization: Digest username="user", realm="rets.server.net", nonce="518ae676272228c981854d964fa3c27e", uri="/rets-treb3pv/server/getobject?Resource=Property&Type=Photo&ID=E2356878%3A%2A&Location=0", cnonce="MDA0NTM2", nc=00000003, qop="auth", response="4d49b094301092839649703384bde9e8", opaque="5ccdef346870ab04ddfe0412367fccba"
Host: rets.server.net:6103
Accept: */*
Cookie: JSESSIONID=46D39B9B7AF641005F474F21D4EC46DB; RETS-Session-ID=0
RETS-Version: RETS/1.5
User-Agent: PHRETS/1.0
Accept: */*

使用代理

GET /rets-treb3pv/server/getobject?Resource=Property&Type=Photo&ID=E2356878%3A%2A&Location=0 HTTP/1.1
Host: rets.server.net:6103
Authorization: Digest username="user", realm="rets.server.net", nonce="90b869eca69494b36bb2fe9123f2a32c", uri="/rets-treb3pv/server/getobject?Resource=Property&Type=Photo&ID=E2356878%3A%2A&Location=0", cnonce="MDA1Nzgw", nc=00000003, qop="auth", response="f4655108472a89d1b482d866667c34d9", opaque="5ccdef346870ab04ddfe0412367fccba"
Accept: */*, */*
Cookie: JSESSIONID=A4D1BDA0327440F64C4E67A6BDBFF521; RETS-Session-ID=0
RETS-Version: RETS/1.5
User-Agent: PHRETS/1.0
X-Forwarded-For: 127.0.0.1
X-Forwarded-Host: 127.0.0.1
X-Forwarded-Server: localhost
Connection: Keep-Alive

我们确实可以看到额外的数据包以 FIN 和 SYN 状态来回传输。知道这是为什么吗?

答案1

不幸的是,看起来这个应用程序似乎对 HTTP 标准相当不严格 - 很难说到底是什么让它感到不安,但是 Apache 所做的某些事情(比如将两个无意义的相同Accept标头合并为一个)很难采取任何措施。

尝试几件事让请求更加相似,希望其中一个变化将使请求达到不再扰乱这个挑剔的 HTTP 服务器的程度。

SetEnv proxy-nokeepalive 1

另一个主要区别是X-Forwarded-标题 - 它们不能通过配置禁用,但有一个补丁在那里将其关闭。

除非其中一个更改有效,否则唯一的其他选择似乎是更深入地了解这个 RETS 应用程序 - 我认为没有办法进行一些好的调试日志记录?客户端在与代理通信时似乎也表现得有点不同,使用新连接来处理新请求,而不是重新使用其打开的连接。我认为客户端上没有日志记录?

相关内容