Apache и mod_proxy не обрабатывают HTTP 100 - продолжить с клиентского HTTP 417 - PullRequest
11 голосов
/ 08 октября 2010

Я создаю магию webby и использую Apache для отправки на наш сервер Tomcat, пересылая запросы на tomcat через порт 8080. У меня проблема с использованием Apache и mod_proxy для пересылки запросов. Похоже, что клиент (веб-приложение) отправляет HTTP-продолжение, на которое Apache отвечает 417 Expectation Failed.

Когда я вынимаю Apache из картинки и отправляю запросы напрямую на tomcat через порт 8080, запрос выполняется успешно, и клиенту отправляется 200 OK.

Мой конфиг Apache выглядит так:

ServerName abcproxy DocumentRoot / apps / apache-content / default

AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript text/xml

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

ExpiresActive on
ExpiresDefault "access 0 seconds"

ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/

        ProxyPreserveHost On

CustomLog /apps/ocp-logs/apache/abcproxy.log combined

Кто-нибудь видит, где я иду не так?

Ответы [ 2 ]

28 голосов
/ 01 декабря 2010

В Apache есть известная и нерешенная проблема с заголовками Expect, см. ошибка 46709 и ошибка 47087 .

Проблема в том, что некоторые клиенты устанавливают заголовок Expect и отправляют только заголовки запроса перед PUT или POST данных.Это позволяет серверу реагировать на ошибки / перенаправления / нарушения безопасности до того, как клиент отправит тело запроса (данные PUT или POST).Это похвальная цель, но, очевидно, клиент не ждет, пока получит ответ, а просто выталкивает тело запроса, что приводит к ошибке 417.

Если у вас есть контроль над .NETклиент, вы можете использовать ServicePointManager.Expect100Continue Свойство , установленное в false, чтобы переопределить это поведение.

Если у вас есть только контроль над сервером, похоже, вы можете принудительно установить HTTP 1.0 для этих клиентов(возможно, на основе строки пользовательского агента) или принудительно удалите заголовок Expect с помощью mod_header в начале запроса.

Чтобы удалить заголовок Expect из запроса на раннем этапе с использованием mod_headers, используйте следующую директиву config:

<IfModule mod_headers.c>
RequestHeader unset Expect early
</IfModule>

Это работает, потому что клиент на самом деле не ожидает ответа «100 Continue» и действует так, как будто заголовок Expect не был установлен.

0 голосов
/ 24 апреля 2019

В нашем конкретном случае это был прокси, ответивший 417. С другой стороны, развертывание, похоже, проигнорировало настройки nonProxyHosts. По сути, мы столкнулись с этой ошибкой: https://github.com/mojohaus/jaxb2-maven-plugin/issues/60, таким образом, jaxb2-maven-plugin исказил наши настройки прокси, и прокси ответил 417.

mvn clean deploy

не удалось. В то время как

mvn deploy

работал. Лучший обходной путь, который я обнаружил (см. Проблему, связанную выше), заключался в использовании другого универсала, который не сломался с помощью jaxb2-maven-plugin (версия 2.4, как известно, по-прежнему имеет эту ошибку прокси):

<extensions>
    <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http-lightweight</artifactId>
        <version>3.3.2</version>
    </extension>
</extensions>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...