Обнаружение 413 (или другого статуса HTTP) в PHP - PullRequest
0 голосов
/ 06 апреля 2020

Я отправляю данные на веб-сервер методом POST или PUT (сервер FreeBSD, Apache httpd, php72).

Я хочу обнаружить 413 (слишком большой) в моем PHP сценарии. Но var_dump (http_response_code ()); дает 200, даже если загруженные данные были слишком большими (Apache httpd отвечает с 413 страницей, и мой скрипт также выполняется).

var_dump ($ _ SERVER); также ничего не отображается с 413.

Как я могу определить статус http как 413 или любой другой в моем скрипте? и возможно ли позволить моему сценарию выводить сообщение об ошибке, а не 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";
}

?>

я использую эту команду для загрузки file

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 -скрипт-вывод. либо пользователь должен получить сообщение об ошибке или вывод моего скрипта. но не оба одновременно.

если бы я смог обнаружить этот 413 в php, я мог бы просто вывести какое-нибудь значимое сообщение и выйти из сценария.

РЕШЕНИЕ

я обнаружил, что если я использую https: // для загрузки файла apache не вызывает мой php -скрипт, если файл слишком велик.

только если я использую http: // apache, эта странная вещь показывает документ с ошибкой AND , выполняющий скрипт 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. странно ... </p>

примечание: использование https получает ответ HTTP / 2 вместо HTTP / 1.1, однако, это должно быть неверной конфигурацией моего веб-хостера или ошибкой в ​​обработке HTTP / 1.1 в apache. Так что проблема решена путем принудительного ввода всех в HTTPS и использования ErrorDocument в .htacces для отображения собственного документа об ошибке, как предложено @ ÁlvaroGonzález, исправил его для меня (пользователи, пытающиеся использовать http, получат ошибку 301 Moved Permanently с правильной https-ссылкой). у меня работает.

спасибо

...