簡體   English   中英

Internet Explorer 8 + Deflate

[英]Internet Explorer 8 + Deflate

我有一個非常奇怪的問題..我真的希望有人有答案,因為我不知道還能在哪里問。

我正在用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;
}

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)

並使用“gzip”作為內容編碼

我想澄清一下我在這上面發現的內容,因為我編寫了自己的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頁,所有其他瀏覽器都足以接受任何一種格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM