Что у меня есть:
У меня есть приложение для 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 после каждого изменения. Эти шаги выполняются постепенно.)
LimitXMLRequestBody 0
и LimitRequestBody 0
LimitXMLRequestBody 100000000
и LimitRequestBody 100000000
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 определен ряд ограничений на размер, включая ограничения на размер запросов, поэтому я бы начал с проверки, что все эти ограничения достаточно велики для ваших нужд.