我使用 POST 或 PUT 方法将数据发送到网络服务器(服务器是 FreeBSD、Apache httpd、php72)。
我想在我的 PHP 脚本中检测 413(太大)。但是 var_dump(http_response_code()); 即使我上传的数据太大也给出 200(Apache httpd 用它的 413 页面回答,我的脚本也被执行)。
var_dump($_SERVER); 413 也没有显示任何内容。
如何在我的脚本中检测像 413 或任何其他的 http 状态?是否可以让我的脚本输出错误消息,而不是 apache?
我的 php 脚本看起来像这样
<?php
header('Content-Type: application/octet-stream');
echo ">---- output from php-script begins here\n";
if (http_response_code() != 200) { # <---- this does not work, always 200, how to detect http status code 413 from apache httpd?
echo ">---- not ok\n";
}
else {
echo ">---- ok\n";
}
?>
我用这个命令上传文件
curl --head --silent --show-error --upload-file test-big-file.txt "my-domain.com/upload.php"
HTTP/1.1 413 Request Entity Too Large
Date: Thu, 09 Apr 2020 12:08:46 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>413 Request Entity Too Large</title>
</head><body>
<h1>Request Entity Too Large</h1>
The requested resource does not allow request data with PUT requests, or the amount of data provided in
the request exceeds the capacity limit.
</body></html>
>---- output from php-script begins here
>---- ok
apache 在我的 php-script-output 中添加一些错误消息对我来说没有多大意义。任何一个用户都应该收到一条错误消息或我的脚本的输出。但不是同时。
如果我在 php 中检测到这个 413,我可以输出一些有意义的消息并退出脚本。
解决方案
我发现如果我使用https://上传文件,如果文件太大,apache 不会调用我的 php 脚本。
只有当我使用http:// apache 时才会显示错误文档并执行 php 脚本。我完全不知道为什么会这样。但是...因为无论如何我都想使用https...对我来说问题已经消失了。
这是一个示例输出,以查看我的情况下 http 和 https 的差异(CustomErrorDocument 是 emtpy,所以除了标题之外没有错误输出显示在这里,在最终版本中,当然会有一个错误文档)
curl --head --silent --show-error --upload-file test-big-file.txt "https://my-domain.com/test.php"
HTTP/2 413
date: Thu, 09 Apr 2020 17:22:23 GMT
server: Apache
content-type: text/html; charset=UTF-8
curl --head --silent --show-error --upload-file test-big-file.txt "http://my-domain.com/test.php"
HTTP/1.1 413 Request Entity Too Large
Date: Thu, 09 Apr 2020 17:22:28 GMT
Server: Apache
Upgrade: h2,h2c
Connection: Upgrade, close
Content-Type: text/html; charset=UTF-8
--> here is the output of the script that should not be executed <--
https调用中缺少“-->此处是不应执行的脚本的输出<--”行...它仅存在于http调用中。奇怪的...
注意:使用 https 会得到 HTTP/2 响应而不是 HTTP/1.1,但是,一定是我的 web 主机配置错误或 apache 中 HTTP/1.1 处理中的错误。因此,通过强制所有内容到 HTTPS 并在 .htacces 中使用 ErrorDocument 来解决问题,以按照@ÁlvaroGonzález 的建议在错误上显示自己的文档,为我修复了它(尝试使用 http 的用户将得到一个 301 Moved Permanently 错误,并带有正确的 https 链接)。为我工作。
谢谢