Как сохранить заголовок Content-Type HTTP-ответа Tomcat, отправленного через соединитель AJP в Apache, используя mod_proxy - PullRequest
7 голосов
/ 03 августа 2010

У меня проблема с неправильным заголовком HTTP Response Content-Type при доступе к веб-службе Axis2, размещенной в Tomcat за Apache, через разъем AJP / 1.3.

Я могу получить доступ к веб-службе без проблемв браузере через его интерфейс RESTful, и я вижу результаты, но каким-то образом Apache изменяет заголовок ответа Content-Type, отправленный Tomcat, с text/xml на text/plain, и это мешает мне использовать веб-сервис через SOAP в NetBeans, потому чтоUnsupported Content-Type: text/plain Supported ones are: [text/xml] исключения.

Вот соответствующий раздел моей конфигурации Apache vhosts:

<VirtualHost *:80>
    ServerAdmin me@myserver.example
    ServerName  myserver.example
    ServerAlias other.myserver.example

    ProxyPreserveHost On 
    SetEnv force-proxy-request-1.0 1
    SetEnv proxy-nokeepalive 1

    <Location /axis2/services>
        ProxyPass ajp://localhost:8009/axis2/services
        ProxyPassReverse ajp://localhost:8009/axis2/services
    </Location>
</VirtualHost>

И соответствующий раздел моего сервера Tomcat server.xml:

<Connector port="8009" protocol="AJP/1.3" redirectPort="9443" />

<Connector port="9443" protocol="HTTP/1.1" SSLEnabled="true" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" disableUploadTimeout="true"
    acceptCount="100" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    SSLCertificateFile="path/to/bundle" 
    SSLCertificateKeyFile="path/to/key"
    SSLPassword="S3cr3t"
    proxyName="myserver.example" proxyPort="443" />

Если я получаю доступ к WS напрямую в Tomcat, используя соединитель по умолчанию на порту 8080, я получаю правильный content-type, но если я получаю доступ к нему через Apache, тогда я получаю text/plain, так что это определенно проблема с прокси.

Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ: Я получил его на работу с помощью коннектора Tomcat HTTP дляПрокси, вместо AJP, но я бы предпочел использовать mod_ajp, если найду работающее решение.

Я просто изменил

ProxyPass ajp://localhost:8009/axis2/services
ProxyPassReverse ajp://localhost:8009/axis2/services

строк на

ProxyPass http://localhost:8080/axis2/services
ProxyPassReverse http://localhost:8080/axis2/services

Ответы [ 3 ]

9 голосов
/ 06 декабря 2011
# DefaultType: the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType None

Это решение.Посмотрите на эту часть в httpd.conf. Важно, чтобы DefalutType был None.Если вы видите обычный текст, это проблема.Извините, это решение не мое, но я не знаю, в каком блоге я его нашел: -)

2 голосов
/ 25 марта 2011

Я провел последние два дня на работе, выискивая что-то похожее на это.

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

https://issues.apache.org/bugzilla/show_bug.cgi?id=49929

Возможно, в Tomcat 7.x есть патч, но никто его еще не тестировал. Я планирую сделать это, когда у меня будет время примерно через неделю, а также подготовить надежный контрольный пример, чтобы это можно было исправить во всех соответствующих версиях tomcat.

Это происходит только при использовании APR, поэтому одно из промежуточных решений - избежать этого (но это может иметь последствия для производительности).

1 голос
/ 09 мая 2012

Это решило головную боль для меня. У меня был Apache 2.2 в качестве внешнего интерфейса с mod_proxy_ajp и jboss в качестве внутреннего. Не удалось выполнить несколько транзакций с

Message: Client found response content type of 'text/plain; charset=UTF-8', but expected 'text/xml'.

Мой Apache имел 'text/plain' в качестве DefaultType. Однако я не изменил это на глобальном уровне (httpd.conf). Я пошел и добавил новую строку в мою конфигурацию vhost в разделе конфигурации <proxy>, установив для нее text/xml.

DefaultType text/xml

Я пытался использовать None, у меня не получилось, тогда я просто получил:

'' in the error msg instead of 'text/plain'.
...