PHP - Sending gzip compressed JS/CSS
I created a style.css.php file with this code:
<?php
$gzip = (ob_get_length() === false && !ini_get("zlib.output_compression") && ini_get("output_handler") != "ob_gzhandler" &&开发者_运维百科 extension_loaded("zlib") && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && !headers_sent());
if(!$gzip) header('Location: style.css');
header('Content-type: text/css');
header('Cache-Control: no-cache');
header('Expires: Mon, 1 Jan 1901 04:20:00 GMT');
ob_start('ob_gzhandler');
include "style.css";
?>
What do you think? Is this a good way to compress js/css files? Is there a better way to do this? I'm doing this for a public app. that can be downloaded by anyone. So there will be people on shared hosts with gzip disabled
No, not OK. There's a lot of things wrong there. The include, no dying after redirecting, not considering the deflate method, ...
This is very simple to do with PHP, as the zlib output handler automatically detects the appropriate compression to send to the client (if any); all you have to do is enable it:
<?php
if (extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler")) {
ini_set("zlib.output_compression", 1);
}
readfile('style.css');
If you're serving your site using Apache, you can use either mod_gzip or mod_deflate. They are usually available on shared hosts and can be configured in .htaccess files.
Add the following lines to your .htaccess file:
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
(ie one per mime-type)
Server should do that automagically if configured properly.
Adam is on the right track but it does not need to be one MIME type per line. See the Apache2 manual for more info on the AddOutputFilterByType directive.
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript text/javascript-x application/javascript
First SET in '.htaccess'
RewriteEngine on
RewriteRule style.css style.css.php
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch MSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI
.(?:gif|jpe?g|png)$ no-gzip dont-vary
</IfModule>
Recomended create css folder and put files there.
With RewriteRule you don't need set header('Content-type: text/css');
and other functions set gzip on server before php process. the code
running more fast now!
精彩评论