Проблемы с параметрами POST с Tomcat/AJP на Apache 2.4 (но не на 2.2)

Я устанавливаю версию нашего веб-приложения на новой машине с Apache 2.4 и Tomcat 7 и не могу заставить работать логин. Текущий сайт работает на Apache 2.2 и Tomcat 6.

Отладка показывает, что request.getParameter() возвращается null только на сайте 2.4.

Я проверил это во всех браузерах, и навигация по сайту работает, поэтому AJP хотя бы частично функционален - только когда я публикую форму, данные формы не видны моему Tomcat.

Конфиг одинаков на обоих:

<VirtualHost *:80>
  ServerName      www.example.com
  ServerAlias      example.com
  ServerAlias      cdn.example.com
  ServerAlias      prod.example.com

  ProxyPreserveHost On
  ProxyPass /images/ !
  ProxyPass /font/ !
  ProxyPass /style/ !
  ProxyPass / ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On
  ProxyPassReverse / ajp://localhost:8009/

И соединитель определен в server.xml как:

<Connector port="8009" address="localhost"
           maxThreads="250" minSpareThreads="5" maxSpareThreads="15"
           connectionTimeout="200000"
           packetSize="16384"
           maxHttpHeaderSize="16384"
           enableLookups="false" redirectPort="8443"
           emptySessionPath="true" URIEncoding="UTF-8" protocol="AJP/1.3"/>

Заголовок запроса браузера:

Host: prod.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es,sv;q=0.9,de;q=0.8,en;q=0.6,es-MX;q=0.5,en-AU;q=0.4,ja;q=0.3,fr;q=0.1
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 73
Referer: http://prod.example.com/en_US/auth/login.action
Cookie: JSESSIONID=07FB9E1A02A4464C0D65B332B53EF02F
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Я включил прямой доступ Tomcat через порт 8080, и логин тоже работает нормально.

Код поступает из того же git-репозитория и ветки, поэтому все остальное должно быть идентично устаревшему сайту. Стоит ли искать изменения в Tomcat 7 или Apache 2.4, чтобы отследить это?

Обновление: я создал очень простой test.jsp с формой для отправки. Я использую...

Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
  String name = (String) paramNames.nextElement();
  String[] values = request.getParameterValues(name);

.. чтобы сбросить параметры. Через прямой 8080 URL это работает отлично, но через Apache/AJP все параметры POST игнорируются, однако, если я добавлю параметры GET вручную в URL, например. ?test=123 они работают нормально.

Обновление 2: я добавил вывод request.getReader() к моему test.jsp и мои данные POST отображаются правильно там, например, t1=Some+text&t2=Testing но request.getParameter("t1") все еще null, Я, должно быть, упускаю что-то действительно глупое.

Обновление 3: Первоначально я думал, что это связано с SSL, но теперь настроил VirtualHost без SSL, и это имеет точно такую ​​же проблему. Моя тестовая страница имеет метку даты, поэтому она не является проблемой кеша.

Обновление 4: я только что сделал следующее изменение, которое позволяет правильно обрабатывать данные формы POST:

# ProxyPass / ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On
# ProxyPassReverse / ajp://localhost:8009/
ProxyPass / http://localhost:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / http://localhost:8080/

Итак, это похоже на ошибку Apache или Tomcat?

1 ответ

Сколько предметов в вашем теле POST? Tomcat имеет максимальное количество из них. Tomcat 7 очень высокий, по умолчанию 10 000. AJP не представляется настраиваемым, хотя есть несколько параметров. Смотрите следующее для обоих:

https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html

Относительно вашего вопроса, эта статья, кажется, предлагает после исчерпывающего тестирования, что это AJP (хотя автор заключил, что это был кот): http://tomcat.10.x6.nabble.com/Tomcat-looses-POST-parameters-td2067515.html. По сути, данные входили в AJP и не появлялись в первом фильтре Tomcat.

По какой причине вы не используете ProxyPass по HTTP?

Другие вопросы по тегам