¿Cuál es la longitud máxima de URL en Tomcat?

43

¿Y es configurable? ¿Puedo configurar Tomcat para que una URL con, digamos, 200K de parámetros de consulta pase correctamente al servlet contenido?

Sí, sé que uno debe usar POST cuando tiene muchos datos; Esa es una opción menos agradable en este caso particular. La aplicación contenida (un motor de búsqueda) espera una solicitud GET para realizar una búsqueda.

Michael Gundlach
fuente

Respuestas:

60

Puede editar la entrada del conector HTTP / 1.1 de tomcat / conf / server.xml y agregar un maxHttpHeaderSize = "65536" para aumentar desde el máximo predeterminado de 8K más o menos, a 64K. Me imagino que podría aumentar este número tan alto como sea necesario, pero 64K es suficiente para mis necesidades en este momento, así que no lo he probado.

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />
Michael Gundlach
fuente
3
Muy útil, resolvió mi problema con Solr. Parece que estábamos rascando el límite predeterminado de 8192 en la server.xmlconfiguración, sin notarlo, y de repente lo golpeamos. Gotcha dolorosa: no se registró nada en eso, las conexiones se interrumpieron en silencio (ya no recuerdo el estado HTTP). Me topé con la documentación en tomcat.apache.org/tomcat-5.5-doc/config/http.html antes, sin embargo, no asocié el maxHttpHeaderSizenombre ni la descripción para que se relacionen con los parámetros de consulta de solicitud GET.
marca el
También llegamos al mismo límite en Solr, nada más que una página en blanco en blanco ... :( El maxHttpHeaderSize hizo el truco.
user85116
Creo que maxHttpHeaderSize = "100000" no es posible, debería multiplicarse por 1024. He cambiado maxHttpHeaderSize = "1048576" que es 1024 * 1024 y todavía no funciona.
3
Una respuesta aceptada, "maxHttpHeaderSize =" 65536 " no funciona. Funcionó antes debido a un error en Tomcat. URL / URI no tiene nada que ver con los encabezados HTTP.
Fuad Efendi
1
@FuadEfendi, ¿cuál es el tamaño máximo ahora?
mjaggard
5

RFC2616 no impone la longitud de una solicitud HTTP GET , como informa Microsoft para su página de soporte de longitud máxima de IE .

Entonces, la longitud máxima de GET es un problema relacionado con el cliente (navegador) . Si su aplicación es utilizada por personas a las que puede obligar a usar un navegador determinado, simplemente puede encontrar cuál es la longitud que admite este navegador.

En todos los casos, sugiero echar un vistazo a la página de Wikypedia sobre los problemas relacionados con el navegador en la cadena de consulta (la parte de la solicitud que trae parámetros para aplicaciones del lado del servidor, la que sigue al "?" Eventualmente presente en una solicitud.

Por supuesto, quizás Tomcat también pondrá un límite, en el lado del servidor. RFC dice:

Los servidores DEBEN poder manejar el URI de cualquier recurso que sirvan, y DEBEN poder manejar los URI de longitud ilimitada si proporcionan formularios basados ​​en GET que podrían generar dichos URI. Un servidor DEBE devolver el estado 414 (Request-URI Too Long) si un URI es más largo de lo que el servidor puede manejar (consulte la sección 10.4.15).

para que pueda probar fácilmente si Tomcat tiene un límite y averiguar cuál es este límite simplemente usando diferentes solicitudes, comenzando con una muy larga que da el error y bajando a la mitad. Luego use el método de bisección para encontrar rápidamente el valor exacto.

drAlberT
fuente
Albert, sabía que Tomcat tenía un límite fuera de la caja (algo así como 8K); Me preguntaba si había un límite que ni siquiera la configuración pudiera superar.
Michael Gundlach
2

Para el conector AJP, debe ajustar el packetSizeatributo:

<Connector port="8009" 
    protocol="AJP/1.3" 
    packetSize="65536" />
1615903
fuente
1
Si está utilizando mod_proxy, también debe configurarlo ProxyIOBufferSize 65536 en su configuración httpd.
suicidio
1

Puede cambiar la configuración en el servidor Tomcat (.. \ Tomcat 6.0 \ conf \ server.xml)

<Puerto del conector = "8983" maxHttpHeaderSize = "100000" protocol = "HTTP / 1.1" connectionTimeout = "20000" redirectPort = "8443" />

Thalaiselvam
fuente
Puede mejorar esta respuesta formateando su código y explicando por qué responde la pregunta OP.
james.garriss