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の基本的な使い方を説明してきました。まだ今回の説明だけだと活用できないレベルだとは思いますが、何ができるのかという点に注目してください。実用的な使い方については、次回以降で説明をしていきます。

おすすめ記事

記事・ニュース一覧