How to determine the Content-Length of a gzipped file?

前端 未结 3 1788
半阙折子戏
半阙折子戏 2020-12-10 12:35

Right now I\'m trying to serve CSS and JS files from a server that won\'t let me enable mod_gzip or mod_deflate. So I wrote a small PHP script to

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-10 13:12

    The problem here is that to know the content length you need to know whether or not the client supports gzip encoding and you've delegated that decision by using ob_gzhandler. From HTTP Headers:

    ob_start();
    ob_start('ob_gzhandler');
    
      ... output the page content...
    
    ob_end_flush();  // The ob_gzhandler one
    
    header('Content-Length: '.ob_get_length());
    
    ob_end_flush();  // The main one
    

    Complete version:

    $filename = "style.css";
    
    if (!file_exists($filename) || !($info = stat($filename))) {
      header("HTTP/1.1 404 Not Found");
      die();
    }
    
    header("Date: ".gmdate("D, j M Y H:i:s e", time()));
    header("Cache-Control: max-age=2592000");
    header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
    header("ETag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
    header("Accept-Ranges: bytes");
    header("Expires: ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
    header("Content-Type: text/css"); // note: this was text/html for some reason?
    
    ob_start();
    ob_start("ob_gzhandler");
    echo file_get_contents($filename);
    ob_end_flush();
    header('Content-Length: '.ob_get_length());
    ob_end_flush();
    

    This is much better than taking on the gzip encoding issue yourself.

提交回复
热议问题