Internet Explorer 8 + Deflate

Tho*_*ini 5 c++ compression apache cgi internet-explorer-8

我有一个非常奇怪的问题..我真的希望有人有答案,因为我不知道还有什么要问的.

我正在用C++编写一个cgi应用程序,它由Apache执行并输出HTML代码.我自己压缩HTML输出 - 从我的C++应用程序中 - 因为我的Web主机由于某种原因不支持mod_deflate.

我用Firefox 2,Firefox 3,Opera 9,Opera 10,谷歌Chrome,Safari,IE6,IE7,IE8,甚至wget测试了它.除了IE8之外,它适用于任何东西.

IE8只是说"Internet Explorer无法显示网页",没有任何信息.我知道这是因为压缩只是因为它可以工作,如果我禁用它.

你知道我做错了什么吗?

我使用zlib来压缩它,确切的代码是:

    /* Compress it */
int compressed_output_size = content.length() + (content.length() * 0.2) + 16;
char *compressed_output = (char *)Alloc(compressed_output_size);
int compressed_output_length;
Compress(compressed_output, compressed_output_size, (void *)content.c_str(), content.length(), &compressed_output_length);

/* Send the compressed header */
cout << "Content-Encoding: deflate\r\n";
cout << boost::format("Content-Length: %d\r\n") % compressed_output_length;
cgiHeaderContentType("text/html");
cout.write(compressed_output, compressed_output_length);


static void Compress(void *to, size_t to_size, void *from, size_t from_size, int *final_size)
{
int ret;
z_stream stream;

stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;

if ((ret = deflateInit(&stream, CompressionSpeed)) != Z_OK)
    COMPRESSION_ERROR("deflateInit() failed: %d", ret);

stream.next_out = (Bytef *)to;
stream.avail_out = (uInt)to_size;
stream.next_in = (Bytef *)from;
stream.avail_in = (uInt)from_size;

if ((ret = deflate(&stream, Z_NO_FLUSH)) != Z_OK)
    COMPRESSION_ERROR("deflate() failed: %d", ret);

if (stream.avail_in != 0)
    COMPRESSION_ERROR("stream.avail_in is not 0 (it's %d)", stream.avail_in);

if ((ret = deflate(&stream, Z_FINISH)) != Z_STREAM_END)
    COMPRESSION_ERROR("deflate() failed: %d", ret);

if ((ret = deflateEnd(&stream)) != Z_OK)
    COMPRESSION_ERROR("deflateEnd() failed: %d", ret);

if (final_size)
    *final_size = stream.total_out;
return;
}
Run Code Online (Sandbox Code Playgroud)

e.t*_*deu 5

gzip和deflate方法不一样......它们非常接近,但是与标题有一些细微的差别,因此,如果更改内容编码,还应该将参数更改为编码方法(具体而言) ,窗口大小)!

请参阅:http://apcmag.com/improve_your_site_with_http_compression.htm

可能其他浏览器忽略了你的内容编码规范并做了一些自动识别,但IE8不是......

请参阅:http://www.zlib.net/manual.html#deflateInit2

尝试使用:

method=Z_DEFLATED
windowBits=-15  (negative so that the header is suppressed)
Run Code Online (Sandbox Code Playgroud)

并使用"gzip"作为内容编码

  • 哇谢谢!我爱你:尽管如此,DA还是很少.有3种(!)压缩格式:zlib - 我正在使用的那种,我认为它是"放气" - ,deflate和gzip.好像它不够混乱,所有3个显然是使用库zlib创建的.没有指定windowBits(就像我正在做的那样)输出zlib格式,使用负值(如你所建议的)输出**DEFLATED**格式(不是gzip!).我不确定如何输出gzip格式(我不在乎,现在它适用于所有浏览器的deflate).再次感谢!!:) (2认同)

小智 5

我想澄清一下我在这上面发现的内容,因为我编写了自己的deflate算法,我自己的HTTP服务器,令我沮丧的是,IE8也未能识别我的缩减内容:

HTTP RFC是http://www.faqs.org/ftp/rfc/rfc2616.pdf.在HTTP标头中执行deflate时,会使用RFC 1950和RFC 1951.RFC 1950只是定义头部和尾部字节; deflate算法在RFC 1951中定义.当我将其编程为规范时,IE8失败.

当我忽略RFC 1950并且只做了RFC 1951时,它就通过了.

那么,我认为IE8没有正确地遵循RFC 2616第17页,所有其他浏览器都足以接受任何一种格式.