Дублированный код состояния в ответе
Я обычно развертываю веб-приложения Java на серверах Tomcat и обращаюсь к ним через прокси-сервер Apache, используя proxy_ajp. Дело в том, что в последних настройках (которые в основном одинаковы) я вижу, что код состояния, который я получаю во всех моих запросах, дублируется (т. Е. "Код состояния:200 200"). Я получаю это в каждом браузере, в Postman, и для любого кода состояния, который могу получить, и все, кажется, работает нормально, но я обеспокоен, что мои настройки могут быть не оптимальными.
Хотя я не могу найти решение, я сузил проблему до ajp_proxy, как будто я изменяю
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
с:
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
Как и ожидалось, я получаю только один код состояния для своих запросов.
Я искал эту проблему, и я не нашел ничего, даже незначительно связанного с ней, поэтому любая информация будет очень цениться.
Информация о сервере:
- Версия Apache: Apache/2.4.18 (Ubuntu)
- Версия Tomcat: apache-tomcat-8.5.13
Заранее спасибо.
3 ответа
Tomcat 8.5 удалил "фразу причины состояния HTTP" из ответа, так что вы получите HTTP 200
вместо HTTP 200 OK
в ответ. Возможно, ваши наблюдения взяты из программного обеспечения, которое дублирует код состояния в фразу причины состояния для отображения.
Как вы соблюдаете код статуса? Вы можете обнаружить, что если вы выполните трассировку протокола, вы увидите, что Tomcat / httpd отправляет только один код состояния.
Это не проблема какого-либо клиентского программного обеспечения, это результат обходного пути, содержащегося в Tomcat для конкретной проблемы AJP от 2008 года: Tomcat Issue Tracker # 45026
Здесь вы можете увидеть соответствующий фрагмент кода org.apache.coyote.ajp.AjpProcessor (Github):
if (sendReasonPhrase) {
/* ... */
if (message == null) {
// mod_jk + httpd 2.x fails with a null status message - bug 45026
message = Integer.toString(response.getStatus());
}
tmpMB.setString(message);
} else {
// Reason phrase is optional but mod_jk + httpd 2.x fails with a null
// reason phrase - bug 45026
tmpMB.setString(Integer.toString(response.getStatus()));
}
Наконец, это означает, что каждый ответ на основе AJP всегда будет содержать фразу причины состояния HTTP - по крайней мере, с номером статуса в качестве содержимого.
Это точно объясняет наблюдаемое поведение ваших двоих ProxyPass
сценарии.
Я бы предложил включить отправку фразы причины через sendReasonPhrase
атрибут в соединителе AJP, пока вы остаетесь в Tomcat 8.5.
Эти атрибуты также существуют для коннектора HTTP.;-)
На самом деле, как указал Кристофер Шульц, я получаю код состояния как код состояния, так и текст причины состояния.
Получение "двойного" кода состояния - это просто визуальное заблуждение, с которым можно столкнуться при использовании инструментов тестирования API, которые обычно довольно печатаются вместе, как единый фрагмент информации, как кода состояния, так и текста причины состояния.