简体   繁体   English

Internet Explorer 8 + Deflate

[英]Internet Explorer 8 + Deflate

I have a very weird problem.. I really do hope someone has an answer because I wouldn't know where else to ask. 我有一个非常奇怪的问题..我真的希望有人有答案,因为我不知道还能在哪里问。

I am writing a cgi application in C++ which is executed by Apache and outputs HTML code. 我正在用C ++编写一个cgi应用程序,它由Apache执行并输出HTML代码。 I am compressing the HTML output myself - from within my C++ application - since my web host doesn't support mod_deflate for some reason. 我自己压缩HTML输出 - 从我的C ++应用程序中 - 因为我的Web主机由于某种原因不支持mod_deflate。

I tested this with Firefox 2, Firefox 3, Opera 9, Opera 10, Google Chrome, Safari, IE6, IE7, IE8, even wget.. It works with ANYTHING except IE8. 我用Firefox 2,Firefox 3,Opera 9,Opera 10,谷歌Chrome,Safari,IE6,IE7,IE8,甚至wget测试了它。除了IE8之外,它适用于任何东西

IE8 just says "Internet Explorer cannot display the webpage", with no information whatsoever. IE8只是说“Internet Explorer无法显示网页”,没有任何信息。 I know it's because of the compression only because it works if I disable it. 我知道这是因为压缩只是因为它可以工作,如果我禁用它。

Do you know what I'm doing wrong? 你知道我做错了什么吗?

I use zlib to compress it, and the exact code is: 我使用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;
}

The gzip and deflate methods aren't the same... they are very close, but there are some subtle differences with the header, so, if you change your content-encoding, you should also change your parameters to the encoding method (specifically, the window size)! gzip和deflate方法不一样......它们非常接近,但是与标题有一些细微的差别,因此,如果更改内容编码,还应该将参数更改为编码方法(具体而言) ,窗口大小)!

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

Probably the other browsers are ignoring your content-encoding specification and doing some automatic recognition, but IE8 is not... 可能其他浏览器忽略了你的内容编码规范并做了一些自动识别,但IE8不是......

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

Try to use: 尝试使用:

method=Z_DEFLATED
windowBits=-15  (negative so that the header is suppressed)

And use "gzip" as the content-encoding 并使用“gzip”作为内容编码

I wanted to clarify what I've discovered on this, as I've written my own deflate algorithm, my own HTTP server, and to my dismay IE8 also failed to recognize my deflated content: 我想澄清一下我在这上面发现的内容,因为我编写了自己的deflate算法,我自己的HTTP服务器,令我沮丧的是,IE8也未能识别我的缩减内容:

HTTP RFC is http://www.faqs.org/ftp/rfc/rfc2616.pdf . HTTP RFC是http://www.faqs.org/ftp/rfc/rfc2616.pdf Page 17 states both RFC 1950 and RFC 1951 is used when performing a deflate in the HTTP headers. 在HTTP标头中执行deflate时,会使用RFC 1950和RFC 1951。 RFC 1950 is simply defining the header and trailer bytes; RFC 1950只是定义头部和尾部字节; the deflate algorithm is defined in RFC 1951. When I programmed this to spec, IE8 failed. deflate算法在RFC 1951中定义。当我将其编程为规范时,IE8失败。

When I ignored RFC 1950 and only did RFC 1951, it passed. 当我忽略RFC 1950并且只做了RFC 1951时,它就通过了。

I would assume, then, that IE8 isn't following RFC 2616 page 17 correctly, and all of the other browsers are nice enough to accept either format. 那么,我认为IE8没有正确地遵循RFC 2616第17页,所有其他浏览器都足以接受任何一种格式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM