在mod_fcgid中处理太长的请求

时间:2014-05-15 20:34:36

标签: php post file-upload mod-fcgid

目标

我想在他们尝试上传的文件太大时向我的客户显示有意义的消息。

问题

现在,当我尝试发送过大的请求时,我的mod_fcgid会引发500内部服务器错误。我不知道如何通过以下方式告知此错误:

  • display_errors设置为0时的PHP错误
  • 请求uri太久
  • 糟糕的重写规则
  • 其他错误配置
  • 完全不同的东西

如果我要告诉我的客户"嘿,你试图上传太大的文件"在500 ISE处理程序中,它也会触发上述所有内容,这没有任何意义。

我尝试过的事情

我目前唯一能做的就是使用ErrorDocument 500 /generic-500.php重定向所有错误。转储$_SERVER$_REQUEST并没有显示任何有用的信息。

可能以丑陋的方式绕过问题:

  1. 在表单
  2. 上创建AJAX包装器
  3. 使其仅为此表单附加自定义标题
  4. 在我重定向到500 ISE
  5. 时检查此标题

    但它相当愚蠢,而且我必须记住为每个上传表单都这样做。

    问题

    如何在PHP中检测500 ISE的原因或重新配置我的服务器,以便在接收到POST请求时我可以在PHP中检测到过大的上传?

3 个答案:

答案 0 :(得分:1)

这很奇怪,但由于服务器中断请求未完成,因此您无法知道请求的长度。

您可以做的最好的事情是使用FcgidMaxRequestLen指令增加对请求正文大小的限制。在服务器处理请求而不产生任何500服务器错误并到达应用程序后,您可以验证应用程序中的内容并向用户返回有意义的消息。

答案 1 :(得分:1)

  

转储$_SERVER$_REQUEST [500错误处理脚本]并没有显示任何有用的信息。

$_SERVER['CONTENT_LENGTH']怎么样,你检查过了吗?如果该值在错误处理脚本中仍然“完整”并且具有客户端最初发送的值,那么可能会继续这样做。

除此之外,用PHP做出这样的错误似乎很难 - 首先必须在mod_fcgid级别处理,这样它仍然调用脚本(或任何脚本,与此有关)及相关信息;但从文档中我看不到任何方法。

作为解决方法,您可以尝试专门针对作为处理文件上传的端点的脚本设置不同的 ErrorDocument脚本 - f.e.通过在FILES指令中使用该指令,该指令仅包含您的上传处理脚本 这样,如果你的“特殊”500错误脚本被调用,那么上传文件太大的原因可能很大 - 你可以告诉用户最有可能他们看到这个错误页面的原因是那个。
当然,您必须尽一切努力确保没有其他原因,为什么这些脚本可能会出现特定的500 - 正如您已经说过的那样,这有点像p.i.t.a.也是,甚至可能不可能以完全可靠的方式......但也许这是一个开始。

最重要的是,在上传开始之前尝试防止这种情况发生可能是一个好主意,客户端 - 在文件上传字段中添加maxlength属性可能不会停止每个每个现有的浏览器都在那里,但对于那些尊重它的人来说,它可能有助于在问题发生之前解决问题。 (HTML5已经指定了该属性;虽然我还没有检查它以什么方式与HTML5表单验证结合使用,以警告用户在这种情况下的具体错误原因。)


作为旁注:从HTTP的角度来看,在这种情况下回复状态代码500似乎不合适 - 413 Request Entity Too Large存在,并且应该将IMHO视为正确的在这种情况下的反应。太糟糕mod_fcgid不会自动执行此操作,因为这样可以基本上解决问题而无需进一步努力。

答案 2 :(得分:0)

set_file_buffer($ f,$ b)怎么样?你可以在那里设置缓冲区大小 - 如果你不能做到这一点,我会使用输出缓冲区方法来控制它......