Какая максимальная длина URL в Tomcat?

43

И это настраивается? Могу ли я настроить Tomcat таким образом, чтобы URL с, скажем, 200 КБ параметров запроса успешно прошел через содержащийся сервлет?

Да, я знаю, что нужно использовать POST, когда у вас много данных; это менее приятный вариант в данном конкретном случае. Содержимое приложения (поисковая система) ожидает GET-запрос для выполнения поиска.

Майкл Гундлах
источник

Ответы:

60

Вы можете отредактировать запись коннектора HTTP / 1.1 в tomcat / conf / server.xml и добавить maxHttpHeaderSize = "65536", чтобы увеличить его с максимального значения по умолчанию, равного 8 КБ или около того, до 64 КБ. Я полагаю, что вы могли бы увеличить это число настолько высоко, насколько это необходимо, но на данный момент мне достаточно 64K, поэтому я не пробовал.

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />
Майкл Гундлах
источник
3
Очень полезно, решил мою проблему с Solr. Кажется, что мы царапали ограничение по умолчанию 8192 в server.xmlконфиге, не замечая, и внезапно достигли его. Уж больно: ничего нигде не было зарегистрировано, соединения были молча разорваны (я больше не помню статус HTTP). Я наткнулся на документацию по адресу tomcat.apache.org/tomcat-5.5-doc/config/http.html ранее, однако я не связывал maxHttpHeaderSizeни по его имени, ни по его описанию с параметрами запроса GET-запроса.
отметка
Мы также просто достигли того же предела в Solr, ничего, кроме пустой белой страницы ... :( MaxHttpHeaderSize добился цели.
user85116
Я думаю, что maxHttpHeaderSize = "100000" невозможно, его нужно умножить на 1024. Я изменил maxHttpHeaderSize = "1048576", который равен 1024 * 1024, и он все еще не работает.
3
Принятый ответ: "maxHttpHeaderSize =" 65536 " не работает Он работал раньше из-за ошибки в Tomcat. URL / URI не имеет ничего общего с заголовками HTTP.
Fuad Efendi
1
@FuadEfendi, каков максимальный размер сейчас?
Мьяггард
5

RFC2616 не устанавливает длину запроса HTTP GET , поскольку Microsoft сообщает о своей странице поддержки максимальной длины IE .

Таким образом, максимальная длина GET является проблемой, связанной с клиентом (браузером) . Если ваше приложение используют люди, которых вы можете заставить использовать определенный браузер, тогда вы можете просто определить, какова длина поддержки этого браузера.

В каждом случае я предлагаю заглянуть на страницу Википедии об этих проблемах, связанных с браузером, в строке запроса (часть запроса, содержащая параметры для приложений на стороне сервера, та, которая следует за «?», Которая в конечном итоге присутствует в запросе).

Конечно, возможно, tomcat установит ограничение на стороне сервера. RFC говорит:

Серверы ДОЛЖНЫ иметь возможность обрабатывать URI любого ресурса, который они обслуживают, и ДОЛЖНЫ иметь возможность обрабатывать URI неограниченной длины, если они предоставляют формы на основе GET, которые могут генерировать такие URI. Сервер ДОЛЖЕН вернуть статус 414 (Request-URI Too Long), если URI длиннее, чем может обработать сервер (см. Раздел 10.4.15).

так что вы можете легко проверить, есть ли у Tomcat лимит, и выяснить, что это за предел, просто используя разные запросы, начиная с очень длинного, сообщающего об ошибке, и снижаясь на половину. Затем используйте метод деления пополам, чтобы быстро найти точное значение.

drAlberT
источник
Альберт, я знал, что у Tomcat был лимит из коробки (что-то вроде 8K); Я задавался вопросом, был ли предел, который даже конфигурация не могла преодолеть.
Майкл Гундлах
2

Для коннектора AJP вам необходимо настроить packetSizeатрибут:

<Connector port="8009" 
    protocol="AJP/1.3" 
    packetSize="65536" />
1615903
источник
1
Если вы используете mod_proxy, вам также необходимо установить его ProxyIOBufferSize 65536 в конфигурации httpd.
самоубийство
1

Вы можете изменить конфигурацию на сервере Tomcat (.. \ Tomcat 6.0 \ conf \ server.xml)

<Connector port = "8983" maxHttpHeaderSize = "100000" protocol = "HTTP / 1.1" connectionTimeout = "20000" redirectPort = "8443" />

Thalaiselvam
источник
Вы можете улучшить этот ответ, отформатировав свой код и объяснив, почему он отвечает на вопрос OP.
james.garriss