「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がうまくいかない!という場合は、この方法を試してみてください。