【问题标题】:Supporting HTTP 100 Continue with PHP支持 HTTP 100 继续使用 PHP
【发布时间】: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-之后立即开始处理继续。我不确定这是否可行,所以我有两个问题:

  1. 是否可以让 PHP 在 Expect: 100-continue 之后立即开始处理?
  2. 如果没有,有什么好的选择?

我目前正在考虑通过指定客户端首先发送与 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


【解决方案1】:

不幸的是,我认为这是不可能的。如果这是一个真正的要求,我认为最好简单地看看其他语言。我认为今天异构环境比写这个问题时更常见,所以为什么不创建一个用其他语言编写的小服务,只处理上传。

但是,是的,PHP 的工作方式是脚本仅在客户端发送整个请求时启动。

【讨论】:

    【解决方案2】:

    尝试在 HTTP 级别上执行此操作似乎太困难了。作为开发人员,不要拘泥于特定的解决方案,这一点很重要。问题是您想在处理上传之前进行一系列检查。您需要做的就是在上传之前放置一个合格页面。如果他们通过一系列检查并符合条件,此合格页面只会向他们显示上传表格。这正是您想要做的,只有您可以在 PHP 代码中做到这一点。如果可能的话,HTTP 100 的东西总是需要大量额外的配置,从而为以后的支持带来麻烦。如果您在代码中执行此操作,那些落后于您(或您自己几年后)将能够清楚地了解应用程序在做什么。

    【讨论】:

    • @Daniel:反馈 - 您的回答似乎为时过早 - 在不了解 OP 的需要的情况下,您建议他放弃处理“HTTP 100 事情”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2011-11-16
    • 2015-02-22
    • 2011-04-22
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多