目标
当他们尝试上传的文件太大时,我想向我的客户端显示有意义的消息.
问题
现在,当我尝试发送太大的请求时,我的mod_fcgid会抛出500内部服务器错误.我不知道如何从下面说出这个错误:
> display_errors设置为0时出现PHP错误
>请求uri太长时间
>糟糕的重写规则
>其他糟糕的配置
>完全不同的东西
如果我要告诉我的客户“嘿,你试图在500 ISE处理程序中上传太大的文件”,它也会触发上述所有内容,这没有任何意义.
我尝试过的事情
我目前唯一能做的就是使用ErrorDocument 500 /generic-500.php重定向所有错误.转储$_SERVER和$_REQUEST没有显示任何有用的内容.
我可以通过以下方式绕过这个问题:
>在表单上创建AJAX包装器
>使其仅为此表单附加自定义标题
>当我被重定向到500 ISE时检查此标题
但它相当愚蠢,我必须记住为每个上传表单执行此操作.
这个问题
如何在PHP中检测500 ISE的原因或重新配置我的服务器,以便在收到POST请求时我可以在PHP中检测到过大的上传?
最佳答案
Dumping
$_SERVER
and$_REQUEST
[inside 500 error handling script] doesn’t show anything useful.
怎么样$_SERVER [‘CONTENT_LENGTH’],你检查过吗?如果该值在错误处理脚本中仍然“完整”并且具有客户端最初发送的值,那么可能会继续这样做.
除此之外,似乎很难对PHP的这种错误作出反应 – 首先必须在mod_fcgid级别处理,以便它仍然使用相关信息调用脚本(或任何脚本) ;但从文档中我看不到任何方法.
作为一种解决方法,您可以尝试专门为脚本设置不同的ErrorDocument脚本,这些脚本是处理文件上载的端点 – 例如.通过在FILES指令中使用该指令,该指令仅包含您的上载处理脚本.
这样,如果你的“特殊”500错误脚本被调用,那么上传文件太大的原因可能很大 – 你可以告诉用户,最可能的原因是它们看到这个错误页面是那样的.
当然,您必须尽一切努力确保没有其他原因可以为这些脚本特别发生500 – 正如您已经说过的那样,这有点像p.i.t.a.也是,甚至可能不可能以完全可靠的方式……但也许这是一个开始.
最重要的是,在上传开始之前尝试防止这种情况发生可能是个好主意,客户端 – 在文件上传字段中添加maxlength属性可能无法阻止每个现有的浏览器,但是对于那些尊重它的人来说,它可能有助于在问题发生之前缓解这个问题. (HTML5已经指定了该属性;虽然我还没有检查它以什么方式与HTML5表单验证结合使用,以警告用户在这种情况下的具体错误原因.)
作为旁注:从HTTP的角度来看,在这种情况下回答状态代码500似乎不太合适 – 存在请求实体太大,并且应该在这种情况下将IMHO视为正确的响应.太糟糕的mod_fcgid不会自动执行此操作,因为这基本上可以解决问题而无需进一步的努力.