Độ dài tối đa của yêu cầu HTTP GET


487

Độ dài tối đa của yêu cầu HTTP GET là bao nhiêu?

Có một lỗi phản hồi được xác định rằng máy chủ có thể / nên trả về nếu nhận được yêu cầu GET vượt quá độ dài này không?

Điều này nằm trong ngữ cảnh của API dịch vụ web, mặc dù thật thú vị khi thấy giới hạn trình duyệt.



7
@KillianDS Hoàn toàn không có gì để làm với độ dài tối đa của URL. Câu hỏi là về độ dài tối đa của yêu cầu được gửi tới URL.
Hầu tước Lorne

2
@EJP nội dung 'dữ liệu' của GET không nhiều hơn URI.
KillianDS

@JimAho bình luận của bạn cũng trùng lặp với bình luận đầu tiên .....
Jun711

Câu trả lời:


463

Giới hạn phụ thuộc vào cả máy chủ và máy khách được sử dụng (và nếu có thể, cũng là proxy mà máy chủ hoặc máy khách đang sử dụng).

Hầu hết các máy chủ web có giới hạn 8192 byte (8 KB), thường có thể định cấu hình ở đâu đó trong cấu hình máy chủ. Đối với vấn đề phía máy khách, đặc tả HTTP 1.1 thậm chí còn cảnh báo về điều này. Đây là trích đoạn của chương 3.2.1 :

Lưu ý: Máy chủ phải thận trọng tùy thuộc vào độ dài URI trên 255 byte, bởi vì một số triển khai máy khách hoặc proxy cũ hơn có thể không hỗ trợ chính xác các độ dài này.

Giới hạn trong Internet Explorer và Safari là khoảng 2 KB, trong Opera khoảng 4 KB và trong Firefox khoảng 8 KB. Do đó, chúng tôi có thể giả định rằng 8 KB là độ dài tối đa có thể và 2 KB là độ dài hợp lý hơn để dựa vào phía máy chủ và 255 byte là độ dài an toàn nhất để giả định rằng toàn bộ URL sẽ xuất hiện.

Nếu vượt quá giới hạn trong trình duyệt hoặc máy chủ, hầu hết sẽ chỉ cắt bớt các ký tự bên ngoài giới hạn mà không có bất kỳ cảnh báo nào. Tuy nhiên, một số máy chủ có thể gửi lỗi HTTP 414 . Nếu bạn cần gửi dữ liệu lớn, thì tốt hơn nên sử dụng POST thay vì GET. Giới hạn của nó cao hơn nhiều , nhưng phụ thuộc nhiều vào máy chủ được sử dụng hơn máy khách. Thông thường, tối đa khoảng 2 GB được cho phép bởi máy chủ web trung bình. Đây cũng là cấu hình ở đâu đó trong cài đặt máy chủ. Máy chủ trung bình sẽ hiển thị lỗi / ngoại lệ dành riêng cho máy chủ khi vượt quá giới hạn POST, thường là lỗi HTTP 500.


6
Bạn trả lời câu hỏi về các giới hạn trình duyệt. Bạn có biết nếu có bất kỳ sự khác biệt nào giữa GET và POST (về kích thước yêu cầu có vấn đề) không, nếu, giả sử, httpClient được sử dụng để tương tác với máy chủ REST?
aioobe

3
Chắc chắn, POST sử dụng cơ thể để gửi dữ liệu. Đặc tả HTTP không áp đặt giới hạn kích thước cụ thể cho các bài đăng.
Ignacio A. Poletti

1
Nó được các thông số kỹ thuật http cho phép hoàn hảo để đặt một cơ thể vào các yêu cầu NHẬN và XÓA. Tôi đã thử nghiệm nó trong Java và nó hoạt động. Thật không may ở đây một lần nữa một số proxy có thể cắt toàn bộ cơ thể.
Nicolas Zozol

12
Phương thức Get and Post có một ý nghĩa rất cụ thể, vì vậy sử dụng POST để thực hiện GET cũng giống như sử dụng búa để đập trứng.
nohros

18
@nohros Điều đó đúng về mặt lý tưởng, nhưng GET cũng có những hạn chế mà POST / PUT không có. Ví dụ: giả sử bạn muốn thực hiện một truy vấn rất dài liên quan đến một loạt các id; nếu bạn đang chọn hàng trăm id, điều đó có thể vi phạm giới hạn kích thước URL được phép, trong khi đặt truy vấn đó vào POST có thể tránh điều đó, ngay cả khi nó không có ý nghĩa nhiều về mặt khái niệm. Cá nhân, tôi muốn HTTP cho phép các yêu cầu GET có các phần giống như PUT và POST.
devios1 29/07/2015

143

Bạn đang hỏi hai câu hỏi riêng biệt ở đây:

Độ dài tối đa của yêu cầu HTTP GET là bao nhiêu?

Như đã đề cập, bản thân HTTP không áp đặt bất kỳ giới hạn mã hóa cứng nào đối với độ dài yêu cầu; nhưng các trình duyệt có giới hạn trong phạm vi 2 KB - 8 KB (255 byte nếu chúng ta đếm các trình duyệt rất cũ ).

Có lỗi phản hồi được xác định rằng máy chủ có thể / nên trả về nếu nhận được yêu cầu GET vượt quá độ dài này không?

Đó là người không ai trả lời.

HTTP 1.1 xác định mã trạng thái 414 Request-URI Too Longcho các trường hợp đạt đến giới hạn do máy chủ xác định. Bạn có thể xem thêm chi tiết về RFC 2616 .

Đối với trường hợp giới hạn do khách hàng xác định, không có bất kỳ ý nghĩa nào trên máy chủ trả lại một cái gì đó, bởi vì máy chủ hoàn toàn không nhận được yêu cầu.


23

Giới hạn trình duyệt là:

Browser           Address bar    document.location
                                 or anchor tag
---------------------------------------------------
Chrome                32779           >64k
Android                8192           >64k
Firefox                >64k           >64k
Safari                 >64k           >64k
Internet Explorer 11   2047           5120
Edge 16                2047          10240

Muốn thêm? Xem câu hỏi này trên Stack Overflow .



3

Về mặt kỹ thuật, tôi đã thấy HTTP GET sẽ có vấn đề nếu độ dài URL vượt quá 2000 ký tự. Trong trường hợp đó, tốt hơn là sử dụng HTTP POST hoặc chia URL.


2

Như đã đề cập, bản thân HTTP không áp đặt bất kỳ giới hạn mã hóa cứng nào đối với độ dài yêu cầu; nhưng các trình duyệt có giới hạn trong phạm vi 2048 ký tự được phép trong phương thức GET.


-6

NHẬN YÊU CẦU bằng trình duyệt Chrome

Đúng. Không có bất kỳ giới hạn nào đối với yêu cầu NHẬN.

Tôi có thể gửi ~ 4000 ký tự như một phần của chuỗi truy vấn bằng cả trình duyệt Chrome và lệnh curl.

Tôi đang sử dụng máy chủ Tomcat 8.x đã trả về phản hồi 200 OK dự kiến.

Dưới đây là ảnh chụp màn hình của yêu cầu HTTP Google Chrome (ẩn điểm cuối tôi đã thử vì lý do bảo mật):

PHẢN ỨNG

NHẬN bằng trình duyệt Chrome

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.