Index: .htaccess =================================================================== RCS file: /cvs/drupal/drupal/.htaccess,v retrieving revision 1.109 diff -u -p -r1.109 .htaccess --- .htaccess 5 May 2010 06:15:59 -0000 1.109 +++ .htaccess 1 Jul 2010 05:24:48 -0000 @@ -109,6 +109,46 @@ DirectoryIndex index.php index.html inde RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !=/favicon.ico RewriteRule ^ index.php [L] + + + # Rules to correctly serve gzip compressed CSS and JS files. + # Requires both mod_rewrite and mod_mime to be enabled. + # Serve gzip compressed CSS files if they exist and the client accepts gzip. + RewriteCond %{HTTP:Accept-encoding} gzip + RewriteCond %{REQUEST_FILENAME}\.gz -s + RewriteRule ^(.*)\.css $1\.css\.gz [L,QSA,T=text/css] + + # Serve gzip compressed JS files if they exist and the client accepts gzip. + RewriteCond %{HTTP:Accept-encoding} gzip + RewriteCond %{REQUEST_FILENAME}\.gz -s + RewriteRule ^(.*)\.js $1\.js\.gz [L,QSA,T=text/javascript] + + # Serve gzip compressed CSS files as 'text/css' (for newer Apache). + + ForceType text/css + + + # Serve gzip compressed JS files as 'text/javascript' (for newer Apache). + + ForceType text/javascript + + + # Force proxies to cache gzipped & non-gzipped css/js files separately. + + + Header append Vary Accept-Encoding + + + # If mod_headers not installed, disable client cache via mod_expires. + + ExpiresDefault A0 + + + + + # Send any files ending in .gz with gzip encoding in the header. + AddEncoding gzip .gz + # $Id: .htaccess,v 1.109 2010/05/05 06:15:59 webchick Exp $ Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.1188 diff -u -p -r1.1188 common.inc --- includes/common.inc 1 Jul 2010 00:46:57 -0000 1.1188 +++ includes/common.inc 1 Jul 2010 05:24:48 -0000 @@ -3178,6 +3178,15 @@ function drupal_build_css_cache($css) { if (!file_exists($uri) && !file_unmanaged_save_data($data, $uri, FILE_EXISTS_REPLACE)) { return FALSE; } + // If CSS gzip compression is enabled, clean URLs are enabled (which means + // that rewrite rules are working) and the zlib extension is available then + // create a gzipped version of this file. This file is served conditionally + // to browsers that accept gzip using .htaccess rules. + if (variable_get('css_gzip_compression', TRUE) && variable_get('clean_url', 0) && extension_loaded('zlib')) { + if (!file_exists($uri . '.gz') && !file_unmanaged_save_data(gzencode($data, 9, FORCE_GZIP), $uri . '.gz', FILE_EXISTS_REPLACE)) { + return FALSE; + } + } // Save the updated map. $map[$key] = $uri; variable_set('drupal_css_cache_files', $map); @@ -4355,9 +4364,18 @@ function drupal_build_js_cache($files) { $uri = $jspath . '/' . $filename; // Create the JS file. file_prepare_directory($jspath, FILE_CREATE_DIRECTORY); - if (!file_unmanaged_save_data($contents, $uri, FILE_EXISTS_REPLACE)) { + if (!file_exists($uri) && !file_unmanaged_save_data($contents, $uri, FILE_EXISTS_REPLACE)) { return FALSE; } + // If JS gzip compression is enabled, clean URLs are enabled (which means + // that rewrite rules are working) and the zlib extension is available then + // create a gzipped version of this file. This file is served conditionally + // to browsers that accept gzip using .htaccess rules. + if (variable_get('js_gzip_compression', TRUE) && variable_get('clean_url', 0) && extension_loaded('zlib')) { + if (!file_exists($uri . '.gz') && !file_unmanaged_save_data(gzencode($contents, 9, FORCE_GZIP), $uri . '.gz', FILE_EXISTS_REPLACE)) { + return FALSE; + } + } $map[$key] = $uri; variable_set('drupal_js_cache_files', $map); } Index: sites/default/default.settings.php =================================================================== RCS file: /cvs/drupal/drupal/sites/default/default.settings.php,v retrieving revision 1.48 diff -u -p -r1.48 default.settings.php --- sites/default/default.settings.php 28 Jun 2010 19:57:34 -0000 1.48 +++ sites/default/default.settings.php 1 Jul 2010 05:24:49 -0000 @@ -371,6 +371,21 @@ ini_set('session.cookie_lifetime', 20000 # $conf['omit_vary_cookie'] = TRUE; /** + * CSS/JS aggregated file gzip compression: + * + * By default, when CSS or JS aggregation and clean URLs are enabled Drupal will + * store a gzip compressed (.gz) copy of the aggregated files. If this file is + * available then rewrite rules in the default .htaccess file will serve these + * files to browsers that accept gzip encoded content. This allows pages to load + * faster for these users and has minimal impact on server load. If you are + * using a webserver other than Apache httpd, or a caching reverse proxy that is + * configured to cache and compress these files itself you may want to uncomment + * one or both of the below lines, which will prevent gzip files being stored. + */ +# $conf['css_gzip_compression'] = FALSE; +# $conf['js_gzip_compression'] = FALSE; + +/** * String overrides: * * To override specific strings on your site with or without enabling locale ? sites/all/modules/README.txt