![Браузеры не получают сжатые страницы в Windows 7 64-битной ОС](https://rvso.com/image/1586620/%D0%91%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80%D1%8B%20%D0%BD%D0%B5%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D1%8E%D1%82%20%D1%81%D0%B6%D0%B0%D1%82%D1%8B%D0%B5%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%20%D0%B2%20Windows%207%2064-%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B9%20%D0%9E%D0%A1.png)
У меня странная проблема с моим ПК с 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, даже если они получены фрагментами.