UNIX的なアレ:gihyo.jp出張所
第13回 知っておきたいApacheの基礎知識 その9
今回は,URLの書き換えに役立つモジュール「mod_rewrite」について解説します。
自分が使っているWebサービスのURLを気にしたことがありますか?
Webサービスで使うURLは静的なページのようにすっきりとさせているケースが多いですね。実際はQueryStringでパラメータを渡して,アプリケーションはその値を参照していることもありますが,SEO的に不利になってしまうケースがあります。そのようなことが起きないために,Apache内部でURLを書き換えてアプリケーションへ渡すといった動作をさせることができます。
今回はURLの書き換えをするときに活用ができる,mod_rewriteを紹介していきます。
mod_rewriteでできること
mod_rewriteができることは,URLの書き換えです。その書き換えパターンが非常に高機能なことから,「スイス製のアーミーナイフ」と表現されることもあります。
また,何でもできてしまうことが,メリットでもあり逆にデメリットとなってしまうとも言えるでしょう。
それでは,実際にmod_rewriteで実現できる書き換えのパターンを見ていきましょう。
- 書き換え前
http://example.com/foo - 書き換え後
http://example.com/index.php?username=foo
さて,書き換え前だとディレクトリ階層で用意されているように見えますが,書き換え後を見てみるとアプリケーションに対してパラメータで渡していることが確認できると思います。
このように,mod_rewriteを活用することで外見のURLを静的にみせることができるようになります。
mod_rewriteを追加する
まず,rewriteを使うためにはモジュールを追加する必要があります。サンプルで用意している手順のとおりApacheをインストールしていれば,使うことができる状態となっています。もし,mod_rewriteがインストールされていない場合は以下の手順で追加してください。なお,下記の例ではApacheのソースを展開したディレクトリを,${APACHE_SRC_DIRECTORY}と表現しています。
$ cd ${APACHE_SRC_DIRECTORY}/modules/mappers
$ sudo /usr/local/apache2/bin/apxs -a -i -c mod_rewrite.c
$ ls /usr/local/apache2/modules/mod_rewrite.so
/usr/local/apache2/modules/mod_rewrite.so
最後にmod_rewrite.soというファイルが作られたことが確認できれば完了です。
mode_rewriteを使ってURLを書き換える
それでは実際にmod_rewriteを使ってみましょう。書き換えのパターンは下記のとおりに書き換えるとします。
- 書き換え前
http://example.com/index.html - 書き換え後
http://example.com/foo/bar/sample.html
それでは,sampleで用意しているhttpd.confを書いてみましょう。
下記の例を参考にしてください。
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/vhosts/www.example.com/htdocs
ServerName www.example.com
ErrorLog /usr/local/apache2/vhosts/www.example.com/logs/error_log
CustomLog /usr/local/apache2/vhosts/www.example.com/logs/access_log common
RewriteEngine on
RewriteLogLevel 9
RewriteLog /tmp/rewrite.log
RewriteRule /index.html /foo/bar/sample.html
</VirtualHost>
それでは上記の設定が追加できたら,Apacheを再起動しましょう。
http://servername/index.htmlへアクセスしてみてください。index.htmlが置いてあったとしても,NotFoundと表示されているでしょう。
それは,index.htmlというリクエストを/foo/bar/sample.htmlへ書き換えているためです。では,/foo/bar/sample.htmlというファイルを用意してアクセスしてみましょう。
$ sudo mkdir -p /usr/local/apache2/vhosts/www.example.com/htdocs/foo/bar/
$ echo "Rewrite Success" | sudo tee /usr/local/apache2/vhosts/www.example.com/htdocs/foo/bar/sample.html
上記のコマンドを実行したら,もう一度アクセスしてみましょう。
Rewrite Success
と表示されれば成功です。Rewriteではこのように,外見のURLを書き換えてApache内で再度マッピングをすることができるのです。慣れるまではわかりづらいですが,まずは動作の概念を理解するようにしましょう。
[TIPS]Perlワンライナーを使ってログを集計してみよう
Apacheのログは非常に貴重なデータで,さまざまな利用方法があります。実際に集計する際には,スクリプトを用意したり,Analogなどのツールを使うことが多いでしょう。
しかしながら,DOS攻撃などを受けているときなどは,緊急で調査をする必要もありますよね。そんな時は,以下のワンライナーを使って特定のIPアドレスからのアクセス数を調査すると,作業が効率化します。
$ perl -e 'open($fh,"./access_log"); while(<$fh>){if($_ =~ /^([0-9.]+)/){$log{$1}+=1}} ; foreach $line (sort keys %log){ print "$log{$line} \t $line \n" } ; close ($fh)'
ただし,ログの量が膨大な場合は,実行に時間がかかります。注意して実行してくださいね。
最後に
さて,今回はmod_rewriteの基本的な使い方を説明してきました。まだ今回の説明だけだと活用できないレベルだとは思いますが,何ができるのかという点に注目してください。実用的な使い方については,次回以降で説明をしていきます。
UNIX, Apache, URL, mod_rewrite

