2017-05-03 4 views
2

私はPHP 7.1を使用していると私は私のウェブサイトを生成するには、次の擬似コードを使用しています:としてPHPのためのob_start(「ob_gzhandlerを」)

<?php 

    ob_start("ob_gzhandler", 0, PHP_OUTPUT_HANDLER_CLEANABLE); 

    try{   
     echo "<h1>My awesome webpage!</h1>"; 
     ... more code that can throw exceptions... 
     echo "<h2>Welcome to my awesome webpage!</h2>"; 
    }catch(\Throwable $e){ 
     ob_clean(); 
     echo "My awesome webpage crashed :(("; 
    } 

例外がスローされない場合は、すべての作品期待:ウェブサイトが出力され、圧縮されます。 You can see the result here

しかし、例外がスローされたときに、予期しない何かが(link to the result)を発生します。必要に応じて、(ob_clean後に出力テキストのみ)をブラウザに送信されるが、それは正しく、それをデコードすることはできません。

この問題は、ブラウザが圧縮されたページの出力を認識しないという事実に関連しているようです。

ob_cleanが呼び出されると、content-encodingというヘッダーがブラウザに送信されない可能性があります。この仮説を確認するために、私は手動でそのヘッダーを設定しようとしましたが、すべて正常に動作します(link)。 (ブラウザがそれをサポートしていないときなど)のob_start(「ob_gzhandlerを」)は常にgzip圧縮を使用していないため、手動でヘッダーを設定するの周りの私の仕事は実行可能ではありません。

<?php 

    ob_start("ob_gzhandler", 0, PHP_OUTPUT_HANDLER_CLEANABLE); 

    try{   
     echo "<h1>My awesome webpage!</h1>"; 
     throw new \Exception("Whops"); 
     echo "<h2>Welcome to my awesome webpage!</h2>"; 
    }catch(\Throwable $e){ 
     ob_clean(); 
     header('content-encoding:gzip'); //Why PHP?... WHYYY?!?!? 
     echo "My awesome webpage crashed :(("; 
    } 

私の質問は以下のとおりです。 。何か恐ろしいハックを使わずに同じ結果を達成するにはどうすればいいですか?

+0

これはバグとして報告しましたか? – Andrea

+2

「恐ろしいハックを使わずに同じ結果を達成するにはどうすればいいですか?」正直言って、私があなたの靴の中にいたなら、私はob_gzhandlerをまったく使用しませんでした。私はあなたのhttpd/proxyを、PHPで処理するのではなく、gzippingを行うように設定します。 –

+0

@アンドレアもし私が何か間違っているとバグかどうか分かりません – Spotlight

答えて

0

私はクイックフィックスが

if(false!==stripos($_SERVER['HTTP_ACCEPT_ENCODING'] ??'','gzip')){ 
    header('content-encoding:gzip'); //Why PHP?... WHYYY?!?!? 
} 

または名前でgzipを持っていることを起こる(理論上の)互換性のない圧縮心配している場合、

if(in_array('gzip',array_map('strtolower',array_map('trim',explode(',',$_SERVER['HTTP_ACCEPT_ENCODING']??''))),true)) 

はまだハック感じているだろうと思い、しかし...

関連する問題