支持HTTP 100继续使用PHP在2010年提出了这个问题,重点略有不同(它寻求一个PHP解决scheme,而不是Apache解决scheme),但从未解决。
HTTP / 1.1规范创build了具有一个定义值的请求头“Expect” 即“100-继续”。 2014年6月发布的修订后的HTTP / 1.1 RFC(见RFC 7231第5.1.1节 )陈述如下:
一个100-继续的期望通知接收者,客户端将在这个请求中发送一个(推测是大的)消息体,并且如果请求行和头字段不足以引起一个立即的成功,redirect或错误响应。 这允许客户端等待在实际发送之前发送消息体的值得指示 ,这可以在消息体巨大时或者当客户机期望可能发生错误时提高效率(例如,当发送状态 – 改变方法,第一次没有预先validation的authentication证书)。
这个规范的这一部分已经被服务器和客户完全实现了,这也是一个普遍接受的陈述。 修改后的规范甚至暗指:
…但是,这个扩展机制还没有被客户使用,许多服务器还没有实现必须了解的需求 。
重点是我的,而不是从规范
即使不包括这个头文件的扩展机制,100的继续价值也似乎执行不力。 如果我们考虑一个标准的PHP / Apache堆栈,如果客户端请求,Apache确实会提供100-continue临时响应。
但是,它完全基于对请求的处理,即不咨询PHP资源。 这似乎破坏了头的目的,因为大多数请求将由于无效的请求参数或许可而失败; 不是由于HTTP请求格式不正确。 因此,即使客户声明了100个继续的期望并收到了100个继续的响应,这并不意味着请求头是有效的。
作为更全面实现HTTP规范(为了提高networking效率,安全性和清晰度)的更广泛意图的一部分,我打算在发送100个继续响应之前更正确地validation请求头。
这意味着请求必须传递给我的PHP资源控制器才能在发送100-continue响应之前进行validation。 这允许在客户端浪费时间和资源发送大型消息主体之前识别无效参数和不正确的权限。
我期望交易所看起来像这样:
Client Apache Resource ->| | | |------Request Head------>| | | |-[Parse] | |<-----400 bad request----| | | |-[Route] | | |-------Request Head-------->| | | |-[Validate] | |<---Error / 100 Continue----| |<--Error / 100 Continue--| | <-|[End or...] | | |------Request Body------>| | | |--------Full Request------->| | | |-[Process] | |<---------Response----------| |<--------Response--------| | <-| | |
显然,这需要PHP应用程序和apache web服务器之间更大的互操作。
由于所需集成的程度,唯一的解决scheme似乎是一个Apache模块/扩展,用于在发送100个继续响应之前立即挂接请求,并执行将请求头传递给PHP资源的额外步骤parsing。
从那里,正常的Apache处理可以恢复,发送100个继续响应,Apache等待消息体,然后将完成的请求传递给PHP资源。
上述的Apache模块是否会改进当前的实现?
过去是否有任何模块试图解决这个问题?
另外,关于开发Apache模块的技术细节:
什么Apache钩子可用? 我无法find标识可用钩子的资源及其处理顺序。 发现它Apache2:Apache挂钩
Apache模块应该如何与PHP交互? 我知道这取决于安装方法(例如Apache进程中的多个线程或每个执行的单个进程等)。 但是我不确定Apache如何pipe理与PHP进程的其他交互。
你所描述的不会与大多数处理程序,包括PHP。 HTTP是基于消息的协议,通常是一个请求 – 回复方法 – 唯一的例外是连接请求,web套接字和expect / 100响应。 因此,实现这个需要重新设计web服务器的内部,处理程序的接口和处理程序本身:对于CGI,fastcgi和isapi模块PHP在web服务器中编组之前不会看到请求。
而且你也必须实现自己的客户端(至少作为一个AJAX / SJAX JavaScript)。
考虑一下,而不是预先发送您的请求:
Client: can I send a really big file? server: 204 Client: here's a really big file
只有一个额外的头集,特别是没有额外的RTT相比expect / 100方法。 花一些时间来计算每个请求的总成本。 很小 它今天将与所有服务器一起工作。 而且这不需要花费数月的时间来开发。 如果不希望陷入这个问题的另一个解决方案的细节之中,显然我们希望URL在这两个客户端请求中都是相同的,所以这两个客户端请求的意图区别将需要在其他地方表达,例如在第一个请求中使用OPTIONS动词,在第二个请求中使用PUT / POST / GET / DELETE。
客户端代码没有什么区别。
但是假设你有一群开发人员和测试人员没有比开发你所建议的模块更好的东西,而且它不需要对处理程序进行大量的修改,或者前面的处理程序的维护者自己构建对expect / 100的支持。我应该,因为网管服务器管理员想要安装这样一个模块,当我可以得到相同的结果,而不必安装额外的模块,增加我的网络服务器的攻击面,并适应我已经使用的任何代码?