Apache2 mod_proxy переносит заголовок HTTP вместо его пересылки
Получая доступ к серверу oracle apex через прокси-сервер apache, я время от времени получаю следующий HTTP-пакет в ответ от сервера:
Connection:Keep-Alive
Date:Fri, 20 Jan 2017 16:00:24 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 () PHP/5.4.16
Transfer-Encoding:chunked
0
HTTP/1.1 200 OK
Server: Oracle XML DB/Oracle Database
Content-Type: text/html; charset=utf-8
Content-Length: 33388
ACTUAL HTML PAGE FROM APEX
Я не знаю, откуда берется 0. Хотя кажется, что Прокси оборачивает полный HTTP-ответ, который он получает от APEX (включая заголовок HTTP), как тело HTTP, в другой пакет HTTP:
<Apache HTTP PACKAGE>
<Apache HTTP HEADER>
Connection:Keep-Alive
Date:Fri, 20 Jan 2017 16:00:24 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 () PHP/5.4.16
Transfer-Encoding:chunked
</Apache HTTP HEADER>
<Apache HTTP BODY>
0
<APEX HTTP PACKAGE>
HTTP/1.1 200 OK
Server: Oracle XML DB/Oracle Database
Content-Type: text/html; charset=utf-8
Content-Length: 33388
ACTUAL HTML PAGE FROM APEX
</APEX HTTP PACKAGE>
</Apache HTTP BODY>
</Apache HTTP PACKAGE>
Вместо этого прокси должен просто переслать пакет HTTP клиенту. Таким образом, клиент получает пакет HTTP, как будто он приходит от APEX, не зная, что он был перенаправлен прокси. Это работает, как и ожидалось, 29 из 30 раз, но иногда ведет себя так, как описано выше. Это ошибка в прокси? Не могли бы вы предложить возможный обходной путь?
1 ответ
Это не упаковка, это связано с transfer-encoding: chunked
заголовок. Смотрите https://en.wikipedia.org/wiki/Chunked_transfer_encoding
0 - это сигнал последнего фрагмента. Со страницы выше:
Каждый чанк начинается с количества октетов данных, которые он встраивает, выраженных в шестнадцатеричном формате в ASCII, за которыми следуют необязательные параметры (расширение чанка) и завершающая последовательность CRLF, за которыми следуют данные чанка. Чанк заканчивается CRLF.
а также
Завершающий блок - это обычный блок, за исключением того, что его длина равна нулю. За ним следует трейлер, который состоит из (возможно, пустой) последовательности полей заголовка объекта. Обычно такие поля заголовка отправляются в заголовке сообщения; однако может быть более эффективным определять их после обработки всего объекта сообщения. В этом случае полезно отправить эти заголовки в трейлер.
Пытаться SetEnv proxy-nokeepalive 1
в вашей конфигурации Apache mod_proxy. Или попробуй
SetEnv proxy-sendcl 1
SetEnv proxy-sendchunked 0
См. http://httpd.apache.org/docs/2.4/mod/mod_proxy.html для объяснений.