Jaka jest maksymalna długość adresu URL w Tomcat?

43

I czy można to skonfigurować? Czy mogę skonfigurować Tomcat, aby adres URL zawierający, powiedzmy, 200 000 par zapytań został pomyślnie przesłany do zawartego serwletu?

Tak, wiem, że należy używać POST, gdy masz dużo danych; w tym konkretnym przypadku jest to mniej przyjemna opcja. Zawarta aplikacja (wyszukiwarka) oczekuje żądania GET w celu wykonania wyszukiwania.

Michael Gundlach
źródło

Odpowiedzi:

60

Możesz edytować pozycję łącznika HTTP / 1.1 tomcat / conf / server.xml i dodać maxHttpHeaderSize = „65536”, aby zwiększyć z domyślnego maksimum 8 KB do 64 KB. Wyobrażam sobie, że możesz zwiększyć tę liczbę tak wysoko, jak to konieczne, ale 64K wystarcza na moje potrzeby w tej chwili, więc nie próbowałem.

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />
Michael Gundlach
źródło
3
Bardzo przydatne, rozwiązałem mój problem z Solr. Wygląda na to, że drapaliśmy się w domyślnym limicie 8192 w server.xmlkonfiguracji, nie zauważając go i nagle go osiągnęliśmy. Bolesna gotcha: nic nie zostało z tego powodu zarejestrowane, połączenia zostały po cichu zerwane (nie pamiętam już statusu HTTP). Wcześniej natknąłem się na dokumentację na tomcat.apache.org/tomcat-5.5-doc/config/http.html , jednak nie skojarzyłem maxHttpHeaderSizejej z nazwą ani opisem, aby była powiązana z samymi parametrami zapytania żądania GET.
zaznacz
Po prostu osiągnęliśmy ten sam limit w Solr, nic prócz pustej białej strony ... :( MaxHttpHeaderSize załatwiło sprawę.
user85116 27.09.12
Myślę, że maxHttpHeaderSize = "100000" nie jest możliwe, powinien być pomnożony przez 1024. Zmieniłem maxHttpHeaderSize = "1048576", który wynosi 1024 * 1024 i nadal nie działa.
3
Przyjęta odpowiedź, „maxHttpHeaderSize =„ 65536 ” nie działa. Działało wcześniej z powodu błędu w Tomcat. URL / URI nie ma nic wspólnego z nagłówkami HTTP.
Fuad Efendi
1
@FuadEfendi jaki jest teraz maksymalny rozmiar?
mjaggard,
5

Długość żądania GET HTTP nie jest wymuszana przez RFC2616 , ponieważ Microsoft zgłasza swoją stronę wsparcia dla maksymalnej długości IE .

Zatem maksymalna długość GET to problem związany z klientem (przeglądarką) . Jeśli Twoja aplikacja jest używana przez osoby, możesz zmusić ją do korzystania z danej przeglądarki, możesz po prostu znaleźć długość obsługiwaną przez tę przeglądarkę.

W każdym przypadku proponuję zajrzeć na stronę Wikypedia w sprawie problemów związanych z przeglądarką w ciągu zapytania (część żądania zawierająca parametry aplikacji po stronie serwera, ta po znaku „?” Ostatecznie pojawiająca się w żądaniu.

Oczywiście może tomcat też nałoży limit, po stronie serwera. RFC mówi:

Serwery MUSZĄ być w stanie obsłużyć identyfikator URI dowolnego obsługiwanego zasobu i POWINNY być w stanie obsłużyć identyfikatory URI o nieograniczonej długości, jeśli dostarczą formularze oparte na GET, które mogłyby generować takie identyfikatory URI. Serwer POWINIEN zwracać status 414 (Zbyt długi identyfikator URI żądania), jeśli identyfikator URI jest dłuższy niż serwer jest w stanie obsłużyć (patrz sekcja 10.4.15).

dzięki czemu możesz łatwo przetestować, czy Tomcat ma limit i dowiedzieć się, jaki jest ten limit, po prostu używając różnych żądań, zaczynając od bardzo długiego zgłaszającego błąd i zmniejszającego się o połowę. Następnie użyj metody bisekcji, aby szybko znaleźć dokładną wartość.

drAlberT
źródło
Albert, zdawałem sobie sprawę, że Tomcat ma limit po wyjęciu z pudełka (coś w rodzaju 8K); Zastanawiałem się, czy istnieje limit, którego nawet konfiguracja nie mogłaby pokonać.
Michael Gundlach
2

W przypadku złącza AJP musisz dostosować packetSizeatrybut:

<Connector port="8009" 
    protocol="AJP/1.3" 
    packetSize="65536" />
1615903
źródło
1
Jeśli używasz mod_proxy, musisz również ustawić ProxyIOBufferSize 65536 w konfiguracji httpd.
samobójstwo
1

Możesz zmienić konfigurację na serwerze Tomcat (.. \ Tomcat 6.0 \ conf \ server.xml)

<Port złącza = „8983” maxHttpHeaderSize = protokół „100000” = „HTTP / 1.1” connectionTimeout = „20000” redirectPort = „8443” />

Thalaiselvam
źródło
Możesz poprawić tę odpowiedź, formatując kod i wyjaśniając, dlaczego odpowiada na pytanie OP.
james.garriss