Использование кодирования передачи chunked и gzip - PullRequest
3 голосов
/ 18 апреля 2010

Я недавно начал использовать gzip на своем сайте, и это работало как чудо во всех браузерах, кроме Opera, которая выдает ошибку о том, что не может распаковать содержимое из-за поврежденных данных. Из того, что я могу почерпнуть из тестирования и поиска в Google, может возникнуть проблема с использованием как gzip, так и chunked Transfer Encoding. Тот факт, что при запросе небольших файлов, таких как css-файлы, ошибок нет, также указывает на это.

Это известная проблема или есть еще что-то, о чем я не думал?

Кто-то также упомянул, что это может быть связано с отправкой заголовка Content-Length.

Вот упрощенная версия наиболее релевантной части моего кода:

$contents = ob_get_contents();
ob_end_clean();
header('Content-Encoding: '.$encoding);
print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
$size = strlen($contents);
$contents = gzcompress($contents, 9);
$contents = substr($contents, 0, $size);
print($contents);
exit();

Ответы [ 2 ]

7 голосов
/ 30 апреля 2010

GZip и chunked-кодирование все время используются вместе в Интернете, поэтому я сомневаюсь, что проблема вызвана только этим.

Не следует отправлять заголовок Content-Length, если используется чанкованное кодирование.

Кроме того, когда вы ведете переговоры для gzip, вы должны отправить Vary: Accept-Encoding (для сжатых и несжатых ответов), и если вы отправляете ETag, они должны отличаться для сжатых и несжатых ответов.

Попробуйте запустить URL через http://redbot.org/ - он проверяет несколько распространенных проблем с кодировкой gzip.

2 голосов
/ 24 октября 2010

В идеале вы должны проверить заголовок запроса от клиента, чтобы убедиться, что он поддерживает закодированный ответ. Заголовок для поиска: «Accept-Encoding: gzip, deflate». Вы также должны, вероятно, проверить, использует ли клиент HTTP 1.1.

...