POST请求中包含Range字段是否标准

蓝皮鼠_93822
  • 2.2k

大家好,我们在用POST请求向我们自研的HTTPSVR发送数据,由于数据是分片的,我们在POST的head里面加上了Range字段来告诉server当前上传文件的偏移值。现在的问题是我们的请求被某些代理过滤掉了Range字段导致我们的sevrer拿不到该字段,我查了下RFC,也没见说POST里面不许加Range的,是否标准呢?

回复
阅读 7.5k
1 个回答
qinjianxiang
  • 5.9k
✓ 已被采纳

参见HTTP RFC:http://www.w3.org/Protocols/rfc2616/r...

HTTP协议的RFC中明确说了,对PUT方法,接收者不能忽视任何Content-* Header,但POST方法没有明确说。这种用法比较冷门,所以,有的Web Server和Proxy很可能不会实现POST方法的Content-Range支持。

GET方法的Content-Range支持是非常普遍的,各种断点续传的下载软件都是靠这个实现的。

开源项目gears上有一篇proposal是讲"POST/PUT 支持 Content-Range"的,你可以参照一下:http://code.google.com/p/gears/wiki/C...

你们的Web Server是自己写的,不存在不支持这个Header的可能,关键就是中间的各类七层代理(负载均衡、反向代理等)。以HAporxy为例,如果打开了keep-alive选项,HAproxy会对后端的Web Server使用HTTP长连接,End User这边发起1000个HTTP请求,HAproxy可能只向后端Web Server发起50个持久连接,这时候,不要说是Content-Range,其它HTTP头也会丢弃。

所以:
1. 如果你不能控制中间的各类七层代理,最好不要使用HTTP协议没有明确规定且不太常用的HTTP Header,改为在HTTP Body里实现。这么做的优点是兼容性好,缺点是性能差一点(相对写在Header中而言)
2. 如果你很在意性能,且不想改动Content-Range的相关代码(从Header移到到Body处理中去),则要有向中间七层代理服务提需求的能力

宣传栏