Codeigniter

サーバー

サイト制作

Codeigniterでcssやjsファイルをgzipする際の注意点

「mod_deflate」が使えないレンタルサーバーなどでCodeigniterを動かしていると、.htaccessファイルを使って静的コンテンツをgzip圧縮することになるのですが、Codeigniterが故にハマった部分があったので、備忘録的に残します。

まず、gzip圧縮から。

mod_deflateが使えない場合のgzipの導入方法は、下記のサイトが非常にわかりやすいです。

参考サイト:改行削除するくらいなら gzip したらいいじゃない

ただし、ここの設定だけでは、Codeigniterではうまくうごきません。

Codeigniter環境で上のやり方を実行すると、css/jsが読み込まれないエラーに遭遇します。念のため言っておくと、上記サイトの説明は正しいです。Codeigniter独自の仕様の問題でエラーになります。

というのも、Codeigniterを動かしている場合、常にルートディレクトリのindex.phpを見るようにRewriteRuleを設定しているはずなので、gzip圧縮したcssファイルやjsファイルが、index.phpに飛ばされて「Not Found」になってしまうからです。ここに気づかなくて、1時間ほどハマってしまいました。。。

ということで、CodeigniterのRewriteRuleを下記のように変更します。

<変更前>

RewriteEngine on
RewriteCond $1 !^(index\.php|images|.+\.css$|.+\.js$|.+\.png$|.+\.gif$|.+\.jpg$|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

<変更後>

RewriteEngine on
RewriteCond $1 !^(index\.php|images|.+\.css$|.+\.css.gz$|.+\.js$|.+\.js.gz$|.+\.png$|.+\.gif$|.+\.jpg$|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

なんてことありません。

「ファイル名.css.gz」と「ファイル名.js.gz」の時はindex.phpに飛ばさないという記述を入れるだけ。簡単ですね。

この記述をすることで、きちんとgzip圧縮したcss/jsファイルが読み込まれるようになりました。

最近のブラウザはほとんどがgzipに対応しているので、サイトの高速化やサーバー負荷の軽減を考えると必ず導入しておきたいgzip圧縮。Codeigniterでgzipがうまくいかない!という場合は、この方法を試してみてください。