Có thể kích hoạt nén http cho các yêu cầu?


35

Tôi thấy nhiều thông tin về việc bật tính năng nén http cho phản hồi của máy chủ nhưng còn về các yêu cầu đến. Sẽ không có ý nghĩa cho các trình duyệt nén các bài viết dạng lớn trước khi gửi chúng đến máy chủ?

Một ví dụ khác là dịch vụ web REST mà chúng tôi sử dụng. Chúng tôi phải gửi các yêu cầu PUT thường xuyên với các tệp XML lớn (10+ MB) và chắc chắn sẽ thấy một số lợi ích về băng thông / tốc độ ở cả hai bên.

Vì vậy, đây có phải là một vấn đề được giải quyết ở phía máy chủ hay mỗi ứng dụng web phải xử lý riêng lẻ?

Câu trả lời:


30

Để PUTdữ liệu đến máy chủ được nén, bạn phải nén phần thân yêu cầu và đặt Content-Encoding: gziptiêu đề. Các tiêu đề phải được giải nén. Nó được ghi lại trong mod_deflate :

Mô-đun mod_deflate cũng cung cấp bộ lọc để giải nén phần thân yêu cầu được nén gzip. Để kích hoạt tính năng này, bạn phải chèn bộ lọc DEFLATE vào chuỗi bộ lọc đầu vào bằng SetInputFilter hoặc AddInputFilter.

...

Bây giờ nếu một yêu cầu chứa tiêu đề Mã hóa nội dung: gzip, phần thân sẽ được tự động giải nén. Rất ít trình duyệt có khả năng gzip cơ quan yêu cầu. Tuy nhiên, một số ứng dụng đặc biệt thực sự hỗ trợ nén yêu cầu, ví dụ như một số máy khách WebDAV.

Và một bài viết mô tả nó ở đây :

vậy bạn sẽ làm sao? Đây là một blurb, một lần nữa từ mã nguồn mod_deflate: chỉ hoạt động theo yêu cầu chính / không có yêu cầu phụ. Điều này có nghĩa là toàn bộ phần thân của yêu cầu phải được nén bằng gzip nếu chúng ta chọn sử dụng phần này, không thể chỉ nén phần chứa tệp trong ví dụ trong yêu cầu nhiều phần.

Một cách riêng biệt, một trình duyệt có thể yêu cầu nén nội dung phản hồi của máy chủ bằng cách đặt Accept-Encodingtiêu đề theo tại đây :

GET /index.html HTTP/1.1
Host: www.http-compression.com
Accept-Encoding: gzip
User-Agent: Firefox/1.0

Điều này sẽ trả lại dữ liệu nén cho trình duyệt.


5
+1 NB Bạn viết you must compress the whole request, inclusive of header. Tuy nhiên, các tiêu đề http không được nén . Điều duy nhất phải được nén (đầy đủ, như bài viết bạn trích dẫn chính xác), là phần thân http.
Eugene Beresovsky

1
Điều này là sai: Accept-Encodingcho máy chủ biết, máy khách hỗ trợ nén cái gì. Tiêu đề Content-Encodingmô tả sự nén của cơ thể.
maaartinus

@maaartinus xem đoạn trích dẫn thứ hai. Tôi đã sắp xếp lại câu trả lời cho rõ ràng.
Andy

4

Trả lời một phần về các yêu cầu nén, không trả lời: có, điều đó là có thể, ngay cả khi nó dường như không được sử dụng rộng rãi. Ứng dụng phía máy khách cần đặt tiêu đề mã hóa nội dung phù hợp. Đối với ứng dụng phía máy chủ, có 2 sự lựa chọn:

  1. ứng dụng hỗ trợ tự khởi động lại cơ thể yêu cầu. Một thư viện ví dụ có thể làm điều này là một thư viện phpxmlrpc.

  2. máy chủ web làm phồng phần thân phản hồi trước khi chuyển nó vào ứng dụng. Điều này có thể sử dụng từ bộ lọc mod_deflate của Apache và thiết lập inputFilter


2

Không phải từ bất kỳ trình duyệt nào tôi biết, bạn sẽ phải tìm một plugin sẽ làm điều đó cho bạn. Về cơ bản, bạn phải đặt tiêu đề HTTP mã hóa nội dung để cho máy chủ biết yêu cầu đến như thế nào. Tất nhiên, máy chủ cần có khả năng xử lý mã hóa đó.


0

Điều này không được phép. Theo đặc tả HTTP ( RFC 2616 ), Content-EncodingKHÔNG phải là một trong các trường tiêu đề yêu cầu có thể, do đó không thể nén phần thân thực thể yêu cầu vì không có cách nào hợp pháp để cho máy chủ biết điều này đã xảy ra. Bất kỳ việc nén nào của phần yêu cầu chỉ được thực hiện dưới dạng phần mở rộng không chuẩn.


12
Câu trả lời này sai RFC 2616 đề cập cụ thể If the content-coding of an entity in a request message is not acceptable to the origin server, the server SHOULD respond with a status code of 415 (Unsupported Media Type).hơn nữa được chỉ định bởi Request and Response messages MAY transfer an entity if not otherwise restricted by the request methodContent-Encodingđược liệt kê dưới dạng tùy chọn trongentity-header
PeterT
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.