Normally you can easily enable Gzip compression using mod_deflate by adding the following lines to your
.htaccess
file:<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript </IfModule> |
So, to serve up your PHP, CSS, and JS files you can try the following method.
Note 1: Your shared web hosting account must support custom
php.ini
and .htaccess
files.Note 2: Be careful when mixing this solution with other cache/compression applications.
Step 1: PHP Configuration
Add or modify the following lines in your custom php.ini file:output_handler = Off zlib.output_compression = On zlib.output_handler = ob_gzhandler |
Step 2: .htaccess Configuration
Add the following lines to the bottom of a .htaccess file in the root of your website.<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*\.js) gzip.php?type=js&file=$1 RewriteRule ^(.*\.css) gzip.php?type=css&file=$1 </IfModule> |
.css
and .js
files through gzip.php
, which we will create in the next step.Step 3: File Processing PHP Script
The following PHP script will inherently use the PHP compression you’ve already enabled and also add headers to your files take advantage of your client’s browser cache to make subsequent loads faster.Create a file named
gzip.php
in your website’s root and add the following lines to it:
//check that zlib compression is enabled
if(!ini_get('zlib.output_compression')){ die(); }
$allowed = array('css','js'); //set array of allowed file types to prevent abuse
//check for request variable existence and that file type is allowed
if(isset($_GET['file']) && isset($_GET['type']) && in_array(substr($_GET['file'],strrpos($_GET['file'],'.')+1), $allowed)){
$data = file_get_contents(dirname(__FILE__).'/'.$_GET['file']); // grab the file contents
$etag = '"'.md5($data).'"'; // generate a file Etag
header('Etag: '.$etag); // output the Etag in the header
// output the content-type header for each file type
switch ($_GET['type']) {
case 'css':
header ("Content-Type: text/css; charset: UTF-8");
break;
case 'js':
header ("Content-Type: text/javascript; charset: UTF-8");
break;
}
header('Cache-Control: max-age=300, must-revalidate'); //output the cache-control header
$offset = 60 * 60;
$expires = 'Expires: ' . gmdate('D, d M Y H:i:s',time() + $offset) . ' GMT'; // set the expires header to be 1 hour in the future
header($expires); // output the expires header
// check the Etag the browser already has for the file and only serve the file if it is different
if ($etag == $_SERVER['HTTP_IF_NONE_MATCH']) {
header('HTTP/1.1 304 Not Modified');
header('Content-Length: 0');
} else {
echo $data;
}
}
?>
|
gzip.php
and output using PHP’s gzip compression library (zlib).This method can be extended to more filetypes by adding to the allowed file types in
gzip.php
and adding more lines to your .htaccess
file.
0 comments:
Post a Comment