程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> firefox提示:內容編碼錯誤 無法顯示您嘗試查看的頁面

firefox提示:內容編碼錯誤 無法顯示您嘗試查看的頁面

編輯:關於PHP編程

今天打幫客戶整理一個網站時發現在firefox提示:內容編碼錯誤 無法顯示您嘗試查看的頁面,因為它使用了無效或者不支持的壓縮格式了,我一看客戶是php站,導致原因可能是ob_gzhandler原因,下面我來總結了解決辦法。

firefox錯誤碼:

內容編碼錯誤

無法顯示您嘗試查看的頁面,因為它使用了無效或者不支持的壓縮格式。

請聯系網站的所有者以告知此問題

 
錯誤原因和解決辦法:

1、保證php程序沒有任何警告或出錯的提示

2、PHP代碼ob_start('ob_gzhandler')導致的,導致的原因有兩種:
      a、服務器不支持這種壓縮格式,可使用function_exists('ob_gzhandler')判斷,解決方法 ob_start('ob_gzhandler')改為ob_start();
      b、使用ob_start('ob_gzhandler')時候前面已經有內容輸出,檢查前面內容以及require include調用文件的內容。若無法找到可以在調用其它文件前使用ob_start(),調用之後使用 ob_end_clean () 來清除輸出的內容;

3、set_magic_quotes_runtime()函數:
提示:Function set_magic_quotes_runtime() is deprecated,導致這個提示的原因是在PHP5.3後此特性已經關閉,在PHP6中已經完全移除此特性,也就是這個函數已經不存在了。你可以注釋 或者刪除掉出錯的行,或者是在set_magic_quotes_runtime()前面加@符號。

4、PHP5.30版本,默認不再支 持這樣的語法,輸出變量需使用php echo $username;?>語法才可以。你可以通過將 php.ini 中的 short_open_tag 設置為 On,以兼容原來的語法。

php關於ob_start('ob_gzhandler')啟用GZIP壓縮的bug

如果使用ob_start("ob_gzhandler");
則ob_clean()後面的輸出將不顯示,這是個bug,
可以用ob_end_clean();ob_start("ob_gzhandler"); 代替ob_clean();
否則後面輸出內容將是空。
<?php
error_reporting(E_ALL);
ob_start("ob_gzhandler");
echo "content";
ob_clean();
echo "more content";
?>
上面的代碼期望輸出more content實際上什麼內容也不會輸出。

下面就正常了
<?php
error_reporting(E_ALL);
ob_start("ob_gzhandler");
echo "content";
ob_end_clean();
ob_start("ob_gzhandler");
echo "more content";
?>

下面自定義一個回調函數再測試
<?php
function my_ob_gzhandler($buffer,$mod){
   header("Content-Encoding: gzip");
   return gzencode($buffer, 9, FORCE_GZIP);
}

error_reporting(E_ALL);
ob_start("my_ob_gzhandler");
echo "content";
ob_clean();
echo "more content";
?>
上面是正常的,但使用ob_end_clean代替ob_clean後又會導致後面的輸出不會顯示。

因此即使是下面的代碼依然會在使用ob_clean或者ob_end_clean後會導致輸出為空。
<?php
if (ini_get('zlib.output_compression')) {
   if (ini_get('zlib.output_compression_level') != 9) {
      ini_set('zlib.output_compression_level', '9');
   }
   ob_start();
} else {
   if (strstr($_SERVER['HTTP_ACCEPT_ENCODING'], "gzip")) {
      ob_start("ob_gzhandler");
   } else {
      ob_start();
   }
}
?>

最穩定的啟用頁面壓縮的方法應該類似下面
<?php
if(extension_loaded('zlib')) {
ini_set('zlib.output_compression', 'On');
ini_set('zlib.output_compression_level', '3');
}
?>

但如果一定要使用ob_gzhandler來啟用頁面壓縮就要注意本文的第一句話了。

事實上,下面的代碼只是浏覽器不顯示
error_reporting(E_ALL);
ob_start("ob_gzhandler");
echo "content";
ob_clean();
echo "more content";

但如果測試一下

telnet localhost 80
GET /test.php HTTP/1.0
<Enter>
<Enter>

將會返回如下信息

HTTP/1.1 200 OK
Date: Fri, 20 Feb 2009 15:40:17 GMT
Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Vary: Accept-Encoding
Content-Length: 12
Connection: close
Content-Type: text/html

more content

失去了跟主機的連接。

可以看出more content已經輸出

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved