CodeIgniter 環境のカスタマイズ - .htaccess
2008年06月16日 01:20
前回お話ししたネタに続いて、いまデフォルトで CodeIgniter をインストールするときの環境について書いておきます。会社で参加している例のブログでは、スタイルシートとかコーディングのネタをやったほうがよさげなので、軽い開発ネタはこちらにしておきます。
CodeIgniter をインストールすると、DocumentRoot の直下に index.php があり、同階層に system ディレクトリがあるという構成になります。具体的な階層構造は、ユーザガイドか解説書をご覧下さい(p.64)。CodeIgniter へのあらゆるリクエストは DocumentRoot の直下にある index.php を通るので、インストールした直後は、
http://localhost/index.php
にアクセスすると、デフォルトのページ(Welcome ページ)が表示されます。
そこで、インストールディレクトリ(ふつうは DocumentRoot)以下をカスタマイズすると、CodeIgniter の全ての動作について有効となる設定を追加できます。もちろん、CodeIgniter 自体の設定ファイル /system/application/config/config.php や、autoload.php などでも設定はできますが、PHP の動作を設定したり、ウェブサーバの動作を設定する必要があれば、インストールディレクトリの .htaccess に記述しておくほうがよいでしょう。
# [ A ]
ServerSignature Off# [ B ]
# ———-
#AddCharset UTF-8 .html .php .inc .class
#AddDefaultCharset Off
php_flag mbstring.encoding_translation off
php_value default_charset “UTF-8″
# ———-# [ C ]
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|PROPFIND|OPTIONS|PROPPATCH|REPORT↵
|MKACTIVITY|CHECKOUT|PUT|MERGE|GET|CONNECT|PATCH|MKCOL|COPY↵
|MOVE|LOCK|UNLOCK|VERSION_CONTROL|UNCHECKOUT|CHECKIN|UPDATE↵
|LABEL|MKWORKSPACE|BASELINE_CONTROL|INVALID) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(libwww|curl|wget|python|nikto|scan).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|’|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(;|’|”).*(union|select|insert|declare|drop|update|md5|benchmark).* [NC,OR]
#RewriteCond %{QUERY_STRING} ^.*(localhost|loopback|127\.0\.0\.1).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(<|>|’|%0A|%0D|%27|%3C|%3E|%00).* [NC]
RewriteCond $1 !^(index\.php|ext|sphider|images|public|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]# ———- 上記でだめな場合は、下記を試してください。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
上記の各設定をざっと説明しておくと、[A] は Apache に設定を伝える部分です。上ではエラー時に表示されるページへサーバのバージョンなどを明記しないよう設定しているだけですが、
AddType application/x-httpd-php .inc .class
などを追加すれば、.php だけでなく .inc とか .class という拡張子でも PHP として動きます。ときどき .html で PHP を動かしている事例を見ますが、PHP コードを埋め込んでもいない .html ファイルが PHP ファイルとして処理されてしまうので、静的な .html ファイルが多い場合はおすすめできません。
[B] では、レンタルサーバなどでエンコードを強制しているときの対策です。レンタルサーバの運用会社がそうしている理由の一つは、海外のサイトを見るとときどきある事例として、(X)HTML ファイルのヘッダー部に、
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
を書いていないページがあるのです。特にエンコードを指定しなくてもページが「表示はされていた」過去の英米のウェブページではともかく、日本語の環境では文字化けの可能性が出てきます。確かにブラウザが「自動判別」してくれる場合もありますが、セキュリティ上はその自動判別によって、UTF-8 を UTF-7 として判別してしまうなど、好ましくないケースもあり、やはりエンコードを指定するよう望まれます。ということなので、エンコードを指定していない人のために euc-jp といった古臭いエンコードを強制しています。
しかし、いまどき euc-jp など強制されては困ります。世の多くのブログツールやプログラムは utf-8 で書かれることが多くなりましたし、データベースも MySQL をはじめ、デフォルトのエンコードを utf-8 にするケースが増えてきました。そのため、utf-8 の設定で euc-jp や iso-2002-jp といった設定を上書きしなくてはなりません。また、そもそもエンコードというものはウェブサーバの設定で何か一つを強制すべきではないと考えられるので、上記のような設定を加えています。
さて [C] は mod_rewrite に関連するリライト設定ですが、CodeIgniter のサンプル設定よりもたくさんの条件が書かれています。条件のひとつ目は完全にセキュリティ対策のためで、%{REQUEST_METHOD}(リクエストのメソッド)として GET, POST, HEAD だけを許容するというものです。実際の話、これ以外のメソッドを必要とするウェブアプリケーションなど殆どないと言ってもよいはずなので、不要なメソッドを受け入れないようにするというのはネットワーク通信をアプリケーションのレベルで正しく運用するための基本と言えます。
次に、%{HTTP_USER_AGENT}(ユーザーエージェント)の値で制限をかけているのは、いわゆる一般的なユーザーエージェントのアクセスだけを許し、wget によるアクセスや libwww あるいは HTTrack といった「ほおむぺえぢコピーツール」のアクセスを断固として拒絶するためのものです。また、ユーザーエージェント文字列やクエリ文字列に XSS の危険性があるため、スクリプトやコマンドを起動させかねない文字列も、ブラックリスト法の一環で条件の中に入れてあります。ただし、
RewriteCond %{QUERY_STRING} ^.*(localhost|loopback|127\.0\.0\.1).* [NC,OR]
については、ローカルの環境でテストするときはコメントアウトしています。リモートで運用するときは、プログラム内で IP アドレスや “localhost” と組み合わせてクエリ文字列を組むなどということはありえないので、有効にしておきます。そして、条件の最後に、
RewriteCond $1 !^(index\.php|ext|images|public|robots\.txt)
と入れて、index.php や ext/ といったディレクトリのリライトを除外します。こうすれば、CodeIgniter のビューで使っているファイルが外部のスタイルシートファイルや JavaScript ファイルを参照するときに、DocumentRoot の直下に ext/ というディレクトリを作って default.css などを入れておけば、ext/ の中にあるファイルへのパスはリライトされなくてすみます。つまり、ローカルの環境で考えると、ビューのファイルは
http://localhost/system/application/views/header.php
といった場所にありますが、表示されるときは、
http://localhost/pageview.html
といった URI で表示されるページに使われるので(設定を追加して、「.html」というダミーの拡張子を使っています)、header.php には
<link rel=”stylesheet” type=”text/css” media=”screen,tv,handheld” href=”ext/default.css” />
という相対パスでよいわけです。
