【发布时间】:2011-01-16 05:57:57
【问题描述】:
我正在开发一个 PHP webapp,它接受来自特定客户端的大型 POST 文件上传,并希望在使用 HTTP 上传文件之前接受或拒绝这些上传(基于各种标头和其他因素,而不仅仅是大小) /1.1 100 继续。
来自HTTP/1.1 spec 8.2.3的一些快速背景:
100(继续)状态(参见第 10.1.1 节)的目的是允许正在发送带有请求正文的请求消息的客户端确定源服务器是否愿意接受请求(基于请求标头)在客户端发送请求正文之前。在某些情况下,如果服务器在不查看正文的情况下拒绝消息,则客户端发送正文可能不合适或效率极低。
问题是Apache从客户端看到Expect:100-continue,返回100 Continue并在PHP开始处理之前接受文件上传...但是我需要PHP在Expect:100-之后立即开始处理继续。我不确定这是否可行,所以我有两个问题:
- 是否可以让 PHP 在 Expect: 100-continue 之后立即开始处理?
- 如果没有,有什么好的选择?
我目前正在考虑通过指定客户端首先发送与 POST 具有相同标头的 HEAD 请求来模拟 100 continue。然后,webapp 可以返回响应以继续 POST 或错误代码。欢迎提出其他建议!
【问题讨论】:
-
我意识到这是一个非常古老的问题,但您最终是否使用了 HEAD 请求,然后是 POST?如果是这样,实施起来有多舒服?我目前对无法在 PHP/Apache 堆栈上正确实现 100-continue 期望感到沮丧。
-
100 continue 在 PHP 中是不可能正确控制的(至少是这样,我已经转向更好的语言)。如果您可以控制客户端,那么是的,发送 HEAD(或任何其他类型的请求)来预检主 POST 是可行的方法。如果您无法控制客户端,则唯一的选择是设置可以拦截 100 并做出适当响应的代理/中间件。
-
我确实可以控制客户端,所以它是一个很好的后备。我目前正在考虑尝试在 Apache 中提供一个钩子,以对标头实施正确的 pre-100-continue 检查。不确定它是否会导致任何有用的地方。 stackoverflow.com/questions/35456122/…
-
您要检查哪些确切的先决条件,以及您要使用 Header 来“防止”什么,包括期望:100-继续?如果客户端不发送 header 中的 100 部分,而是直接发送 body,会发生什么?顺便说一句,是客户端还是你的 http/api 客户端?
标签: php rest http-status-code-100 http-1.1