Чи можна включити стиснення http для запитів?


35

Я бачу багато інформації про ввімкнення стиснення http для відповідей сервера, але що стосується вхідних запитів. Чи не було б сенсу для браузерів стискати публікації великих форм, перш ніж надсилати їх на сервер?

Інший приклад - веб-сервіс REST, який ми використовуємо. Ми повинні надсилати часті запити PUT з великими XML-файлами (10+ Мб) і, безумовно, побачите певні переваги пропускної здатності / швидкості з обох сторін.

Так це вирішена проблема на стороні сервера чи кожен веб-додаток має вирішувати його окремо?

Відповіді:


30

Для PUTстиснення даних на сервері потрібно стиснути тіло запиту та встановити Content-Encoding: gzipзаголовок. Сам заголовок повинен бути нестисненим. Це задокументовано в mod_deflate :

Модуль mod_deflate також забезпечує фільтр для декомпресії стисненого тіла запиту gzip. Для активації цієї функції вам потрібно вставити фільтр DEFLATE у ланцюг вхідних фільтрів за допомогою SetInputFilter або AddInputFilter.

...

Тепер, якщо запит містить заголовок Content-Encoding: gzip, тіло буде автоматично декомпресовано. Небагато веб-переглядачів мають можливість gzip-тел запитів. Однак деякі спеціальні програми насправді підтримують стиснення запиту, наприклад, деякі клієнти WebDAV.

А стаття, що описує це, тут :

То як же це зробити? Ось розмиття, знову ж таки, з вихідного коду mod_deflate: працюйте лише за основним запитом / без підзапитів. Це означає, що все тіло запиту має бути стиснутим gzip, якщо ми вирішили використовувати це, неможливо стиснути лише ту частину, що містить файл, наприклад, у запиті з декількома частинами.

Окремо браузер може вимагати стиснення вмісту відповіді сервера, встановивши Accept-Encodingзаголовок, як описано тут :

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

Це поверне стислі дані в браузер.


5
+1 NB Ви пишете you must compress the whole request, inclusive of header. Однак заголовки http не повинні стискатися . Єдине, що потрібно стиснути (повністю, як правильно зазначено у статті, яку ви цитуєте), це тіло http.
Євген Бересовський

1
Це неправильно: Accept-Encodingповідомляє серверу, яку компресію підтримує клієнт. Заголовок Content-Encodingописує стиснення тіла.
maaartinus

@maaartinus див. першу цитату другий абзац. Я реорганізував відповідь для наочності.
Енді

4

Відповідаючи на частину про стислі запити, а не на відповіді: так, це можливо, навіть якщо це не здається в широкому використанні. Клієнтській програмі потрібно встановити відповідний заголовок кодування вмісту. Щодо додатка на сервері, є два варіанти:

  1. додаток підтримує перезаповнення тіла запиту самостійно. Приклад бібліотеки, яка може це зробити, - це phpxmlrpc.

  2. веб-сервер надуває тіло відповідей, перш ніж передавати його в додаток. Це можливо за допомогою фільтра mod_deflate Apache та налаштування inputFilter


2

Не рідно з будь-якого браузера, про який я знаю, вам доведеться знайти плагін, який би зробив це за вас. Ви, як правило, повинні встановити HTTP-заголовок, що кодує контент, щоб сервер знав, як надходить запит. Сервер, звичайно, повинен мати можливість обробляти це кодування.


0

Це НЕ дозволено. Відповідно до специфікації HTTP ( RFC 2616 ), Content-EncodingНЕ є одним із можливих полів заголовка запиту, тому неможливо стиснути тіло запиту, оскільки немає законного способу повідомити сервер про це. Будь-яке стиснення тіла запиту виконується лише як нестандартне розширення.


12
Ця відповідь є невірною. RFC 2616 конкретно згадує, що, 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).крім того, вказано Request and Response messages MAY transfer an entity if not otherwise restricted by the request methodі Content-Encodingвказане як варіант вentity-header
PeterT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.