![Apache2 mod_proxy оборачивает HTTP-заголовок вместо его пересылки](https://rvso.com/image/697361/Apache2%20mod_proxy%20%D0%BE%D0%B1%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%B5%D1%82%20HTTP-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE%20%D0%B5%D0%B3%D0%BE%20%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%8B%D0%BB%D0%BA%D0%B8.png)
Обращаясь к серверу 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. Хотя, похоже, что Proxy оборачивает полный 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/Кодирование_передачи_фрагментов
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#request-bodiesдля объяснений.