Назад | Перейти на главную страницу

Ошибка HTTP: объект запроса 413 слишком большой

Что у меня есть:
У меня есть приложение для iPhone, которое отправляет запросы HTTP POST (формат XML) в веб-службу, написанную на PHP. Это на размещенный виртуальный частный сервер так что я могу редактировать httpd.conf и другие файлы на сервере и перезапустите Apache.

Эта проблема:
Веб-служба работает отлично, если размер запроса не слишком велик, но предел составляет около 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<br />/<br />
does not allow request data with POST requests, or the amount of data
provided in the request exceeds the capacity limit.
</body></html>

Веб-служба записывает свой собственный файл журнала, и я вижу, что небольшие сообщения обрабатываются нормально. Сообщения большего размера вообще не регистрируются, поэтому я предполагаю, что что-то в Apache отклоняет их еще до того, как они достигают веб-службы?

То, что я пробовал безуспешно:
(Я перезапускал Apache после каждого изменения. Эти шаги выполняются постепенно.)

  1. веб-панель настройки хостинг-провайдера: отключить mod_security
  2. httpd.conf: LimitXMLRequestBody 0 и LimitRequestBody 0
  3. httpd.conf: LimitXMLRequestBody 100000000 и LimitRequestBody 100000000
  4. httpd.conf: SecRequestBodyLimit 100000000

На этом этапе Apache error.log содержит сообщение:
ModSecurity: Request body no files data length is larger than the configured limit (1048576)

Тот факт, что ModSecurity сообщает об ошибке, указывает на то, что мой шаг №1 на самом деле не прошел. Апачи access.log выглядит так, с 3 успешными маленькими сообщениями и 2 неудачными большими сообщениями:

"POST / HTTP/1.1" 200 310 "-" "Audiopad/1.0 CFNetwork/548.0.4 Darwin/11.0.0"
"POST / HTTP/1.1" 200 310 "-" "Audiopad/1.0 CFNetwork/548.0.4 Darwin/11.0.0"
"POST / HTTP/1.1" 200 310 "-" "Audiopad/1.0 CFNetwork/548.0.4 Darwin/11.0.0"
"POST / HTTP/1.1" 413 464 "-" "Audiopad/1.0 CFNetwork/548.0.4 Darwin/11.0.0"
"POST / HTTP/1.1" 413 464 "-" "Audiopad/1.0 CFNetwork/548.0.4 Darwin/11.0.0"

Апачи error.log есть эта информация о больших сообщениях:

[error] [client 194.24.138.43] ModSecurity: Request body no files data length is larger than the configured limit (1048576). [hostname "webservice-audiopad.golfbravo.net"] [uri "/"]
[error] [client 194.24.138.43] ModSecurity: Request body no files data length is larger than the configured limit (1048576). [hostname "webservice-audiopad.golfbravo.net"] [uri "/"]

Однако я не вижу значения 1048576 где угодно в httpd.conf.

Что еще я могу попробовать, чтобы веб-служба принимала большие сообщения?

Я столкнулся с той же самой проблемой.

SecRequestBodyNoFilesLimit был причиной.

он вообще не использовался в моей конфигурации, но у него есть значение по умолчанию, 1048576.

Как только я обнаружил, что этот параметр существует, я установил его больше, чем мои файлы, и все заработало.

Вот документация https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#wiki-SecRequestBodyNoFilesLimit

если вы сравните с записью выше SecRequestBodyLimit, документация кажется очень запутанной. То, что я смог свести к следующему: Если вы загружаете фактическое вложение файла, приоритет будет иметь предыдущая настройка. Если вы вставляете содержимое файла в нечто вроде формы, а полезная нагрузка находится в PUT, тогда правила SecRequestBodyNoFilesLimit.

Я установил SecRequestBodyAccess Off на данный момент и это решило все проблемы.

Вы говорите, что это служба PHP, а это значит, что php.ini всегда так же задействован, как и httpd.conf.

В php.ini определен ряд ограничений на размер, включая ограничения на размер запросов, поэтому я бы начал с проверки, что все эти ограничения достаточно велики для ваших нужд.