У меня странная проблема с моим ПК с Windows 7 64-бит на работе. Я администрирую несколько веб-серверов Linux, которые обслуживают сжатый gzip-контент (js, css, html). Странное поведение заключается в том, что когда все браузеры в моей системе (Firefox, Chrome, Vivaldi) запрашивают контент с этих серверов Linux (я Accept-Encoding: gzip,deflate
прекрасно вижу заголовок), они его не получают. Все ответы приходят с Transfer-Encoding: chunked
, поэтому контент не сжимается. Однако при запуске curl
в командной строке с --compressed
опцией ответ приходит с Content-Type: gzip
заголовками Content-Length
и и сжимается gzip, как и должно быть. С сервера Windows 2008 R2 контент обслуживается сжатым gzip.
Передача содержимого в сжатом виде на этих веб-серверах Linux гарантированно работает нормально.
Включен прокси pfSense, но даже если я переопределяю его в настройках прокси, чтобы браузер запрашивал контент напрямую с серверов Linux, поведение остается прежним. Никаких изменений, с прокси или без него.
Я подтвердил проблему с Firefox и Chrome на другом ПК с Windows 7 64-бит. Поэтому я пришел к выводу, что ОС каким-то образом вовлечена в это странное поведение браузера.
Может ли кто-нибудь подтвердить...?
решение1
Это может быть обманчиво: чтобы отправить сжатый gzip-файл в одном сообщении, серверу необходимо иметь весь файл в наличии и знать его размер, чего, по-видимому, в вашем случае не происходит, как вы сами сказали:
Запустив curl в командной строке с
--compressed
опцией , ответ приходит сContent-Type: gzip
заголовкамиContent-Length
и сжат, как и положено.
Я думаю, что в вашем случае сервертрубывывод в gzip, а затем передает результат напрямую в браузер без предварительной записи данных на диск для вычисления размера файла. Не зная заранее размера, сервер не имеет иного выбора, кроме как вернуть поток с Transfer-Encoding: chunked
таким количеством частей, которые станут доступны.
По мере того, как данные становятся доступными, они будут возвращаться в виде фрагментов, которые будут повторно собраны браузером. Однако полученные данные все еще сжаты gzip, даже если они получены фрагментами.