Độ dài URL tối đa trong Tomcat là bao nhiêu?


43

Và nó có thể cấu hình? Tôi có thể thiết lập Tomcat để một URL có, với 200K thông số truy vấn được chuyển thành công đến servlet được chứa không?

Có, tôi biết người ta nên sử dụng POST khi bạn có nhiều dữ liệu; đó là một lựa chọn ít dễ chịu hơn trong trường hợp cụ thể này. Ứng dụng được chứa (một công cụ tìm kiếm) mong muốn một yêu cầu GET để thực hiện tìm kiếm.

Câu trả lời:


60

Bạn có thể chỉnh sửa mục nhập Trình kết nối HTTP / 1.1 của tomcat / conf / server.xml và thêm maxHttpHeaderSize = "65536" để tăng từ mức tối đa mặc định là 8K hoặc hơn, lên 64K. Tôi tưởng tượng rằng bạn có thể tăng con số này cao đến mức cần thiết, nhưng 64K đủ cho nhu cầu của tôi vào lúc này vì vậy tôi đã không thử nó.

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />

3
Rất hữu ích, giải quyết vấn đề của tôi với Solr. Có vẻ như chúng tôi đã cào vào giới hạn 8192 mặc định trong server.xmlcấu hình mà không nhận thấy và bất ngờ nhấn nó. Gotcha đau đớn: không có gì được ghi lại về điều đó, các kết nối đã âm thầm bị hủy (tôi không nhớ lại Trạng thái HTTP nữa). Tôi đã tình cờ tìm thấy tài liệu tại tomcat.apache.org/tomcat-5.5-doc/config/http.html trước đây, tuy nhiên tôi đã không liên kết maxHttpHeaderSizetên của nó cũng như mô tả của nó có liên quan đến chính các tham số truy vấn yêu cầu GET.
đánh dấu

Chúng tôi cũng chỉ đạt giới hạn tương tự trong Solr, không có gì ngoài một trang trắng trống rỗng ... :( MaxHttpHeaderSize đã thực hiện thủ thuật.
user85116

Tôi nghĩ rằng maxHttpHeaderSize = "100000" là không thể, nó sẽ được nhân lên với 1024. Tôi đã thay đổi maxHttpHeaderSize = "1048576" là 1024 * 1024 và nó vẫn không hoạt động.

3
Một câu trả lời được chấp nhận, "maxHttpHeaderSize =" 65536 " không hoạt động. Nó hoạt động trước đây do lỗi trong Tomcat. URL / URI không liên quan gì đến HTTP Headers.
Fuad Efendi

1
@FuadEfendi bây giờ kích thước tối đa là bao nhiêu?
mjaggard

5

Độ dài của yêu cầu HTTP GET không được RFC2616 thực thi , vì Microsoft báo cáo cho trang hỗ trợ độ dài tối đa IE của nó .

Vì vậy, độ dài GET tối đa là một vấn đề liên quan đến máy khách (trình duyệt) . Nếu ứng dụng của bạn được sử dụng bởi những người bạn có thể buộc sử dụng một trình duyệt nhất định thì bạn có thể chỉ cần tìm độ dài mà trình duyệt này hỗ trợ.

Trong mọi trường hợp, tôi đề nghị xem trang Wikypedia về các vấn đề liên quan đến trình duyệt trên chuỗi Truy vấn (phần yêu cầu mang tham số cho các ứng dụng phía máy chủ, cuối cùng là "?" Xuất hiện trong yêu cầu.

Tất nhiên có lẽ tomcat cũng sẽ đặt một giới hạn, về phía máy chủ. RFC nói:

Máy chủ PHẢI có thể xử lý URI của bất kỳ tài nguyên nào chúng phục vụ và NÊN có thể xử lý các URI có độ dài không giới hạn nếu chúng cung cấp các biểu mẫu dựa trên GET có thể tạo ra các URI đó. Máy chủ NÊN trả về trạng thái 414 (URI yêu cầu quá dài) nếu URI dài hơn máy chủ có thể xử lý (xem phần 10.4.15).

vì vậy bạn có thể dễ dàng kiểm tra xem Tomcat có giới hạn hay không và tìm ra giới hạn này chỉ đơn giản là sử dụng các yêu cầu khác nhau bắt đầu bằng một yêu cầu rất dài đưa ra lỗi và giảm một nửa. Sau đó sử dụng phương pháp chia đôi để nhanh chóng tìm ra giá trị chính xác.


Albert, tôi đã biết rằng Tomcat có một giới hạn ngoài hộp (giống như 8K); Tôi tự hỏi nếu có một giới hạn mà ngay cả cấu hình không thể vượt qua.
Michael Gundlach

2

Đối với trình kết nối AJP, bạn cần điều chỉnh packetSizethuộc tính:

<Connector port="8009" 
    protocol="AJP/1.3" 
    packetSize="65536" />

1
Nếu bạn đang sử dụng mod_proxy, bạn cũng cần phải đặt ProxyIOBufferSize 65536 trong cấu hình httpd của mình.
tự sát

1

Bạn có thể thay đổi cấu hình tại máy chủ Tomcat (.. \ Tomcat 6.0 \ conf \ server.xml)

<Cổng kết nối = "8983" maxHttpHeaderSize = "100000" giao thức = "HTTP / 1.1" ConnectionTimeout = "20000" redirectPort = "8443" />


Bạn có thể cải thiện câu trả lời này bằng cách định dạng mã của bạn và giải thích lý do tại sao nó trả lời câu hỏi OP.
james.garriss
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.