Internet Explorer 8 + 放气

2024-05-09

我有一个非常奇怪的问题..我真的希望有人能给出答案,因为我不知道还能去哪里问。

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

我用 Firefox 2、Firefox 3、Opera 9、Opera 10、Google Chrome、Safari、IE6、IE7、IE8,甚至 wget 对此进行了测试。它适用于ANYTHING除了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;
}

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

See: http://apcmag.com/improve_your_site_with_http_compression.htm http://apcmag.com/improve_your_site_with_http_compression.htm

可能其他浏览器会忽略您的内容编码规范并进行一些自动识别,但 IE8 不会...

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

尝试使用:

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

并使用“gzip”作为内容编码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Internet Explorer 8 + 放气 的相关文章