第4回 ApacheとWebアプリケーションの連携
竹下 肯己株式会社 qnote
2010/6/21
ブラウザから渡されたURLの解釈は、Webサーバで行うべきか、Webアプリ(フレームワーク)側で行うべきか。設計上の選択に幅があることをWeb開発者としても理解しておきたいものです(編集部)
スッキリしたURLの表現を使う
- - PR -
Webアプリケーションでは、ブラウザ側で指定するURLは特別な意味を持っています。
それは、ニュース記事などのように単にコンテンツの所在を示すだけでなく、そのWebアプリケーションで扱うサブメニューやパラメータまでをURLの一部として表現し、サーバ側にこれらを伝える役割を果たすことがあるためです。
例えば、以下のようにパラメータでコンテンツのIDやアプリケーションが取るべきアクション、その際に指定するモードを並べたURLが考えられます。
http://サーバ名/index.php?action=test&mode=edit&id=123 ....
このようなURLでWebアプリケーションを実行してももちろん構わないのですが、パラメータが増えるにしたがって分かりづらくなりますし、SEO対策的にも好ましくありません。上記を、例えば以下のようなURLで表現できたらどうでしょうか。
http://サーバ名/test/edit/123
かなりスッキリしますね。Apacheの拡張機能を利用すると、ブラウザ側で指定されたURLを、サーバ側で任意のURLに書き換えて、リダイレクトさせることができます。このとき、静的ページのようなURLから、旧来の動的なURLへと書き換えるようにしてあげれば、見た目は上記のようなスッキリしたURLで、Webアプリケーションを動作させることができるわけです。また、あえてApache側では複雑な書き換えを行わず、Webアプリケーション側でパラメータを抽出するようにしてあげると、さらに柔軟な解釈も可能となります。
拡張機能「mod_rewrite」でURLを書き換える
Apacheの拡張機能であるmod_rewriteを使うと、アクセスされたURLを書き換えてリダイレクトさせることができます。
mod_rewriteはApacheの拡張モジュールとして提供されています。当連載で解説した手順でApacheをインストールしていれば、mod_rewriteのモジュールは既に組み込まれているはずです。ソースからインストールした場合にはインストール先(/usr/local/apache2 など)の下のmodulesというディレクトリに、RPMからインストールした場合には /etc/httpd/modules というディレクトリに、「mod_rewrite.so」というファイルが存在するはずです。これがmod_rewriteのモジュールです。
次にhttpd.confを見てみると、「LoadModule rewrite_module modules/mod_rewrite.so」という設定があると思います。これは文字通り、先ほどの拡張モジュールをロードするための設定です。Apacheの機能の多くは、このようにモジュールで提供され、必要に応じてロードして利用する仕組みとなっています。
mod_rewriteによるURLの書き換えはディレクトリごとに設定するため、前回の記事でご紹介した「
.htaccessを利用する場合、対象ディレクトリに対して、AllowOverrideにて設定の上書きが許可されている必要があります(AllowOverrideについては前回の記事を参照してください)。mod_rewriteを設定するには、少なくともFileInfoが上書き可能になっている必要がありますが、今回は「AllowOverride ALL」ですべて上書き可能としました。
また、同じく.htaccessでmod_rewriteを設定するには、Optionsで少なくともFollowSymLinksが有効になっている必要があります(Optionsについても前回の記事で紹介しました)。
今回はApacheをRPMでインストールした環境で、デフォルトのドキュメントルート(/var/www/html)に.htaccessを設置してmod_rewriteによるリダイレクトを試してみることにします。httpd.conf内の、ドキュメントルートに対する設定例を下記に示しておきます(httpd.confを編集したらApacheを再起動してください)。
<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
mod_rewriteの基本
では実際にリダイレクトの設定をしてみましょう。ドキュメントルート(/var/www/html)の下に.htaccessを作成し、以下のように記述してみてください(ドキュメントルートにindex.htmlがあることを前提とします)。
RewriteEngine On RewriteBase / RewriteRule ^.*$ index.html
そして、http://サーバ名/xxx/ooo というURLでアクセスしてみてください(もちろん、ドキュメントルートには「xxx/ooo」というディレクトリやファイルは存在しないものとします)。
ご想像通り、ドキュメントルートのindex.htmlが表示されたはずです。.htaccessの設定がなければ、これはもちろん404(Not Found)のエラーとなります。
上記は、mod_rewriteのもっとも単純な設定例です。設定項目を順番に見ていきましょう。
- RewriteEngine
- mod_rewrite の機能の On/Off を指定します。
- RewriteBase
- URL書き換えの基準となるディレクトリです。この設定項目は省略可能で、省略した場合には実際のURLの階層が適用されます。例えば、/var/www/html/test/にmod_rewriteを設定した場合、デフォルトのRewriteBaseは“/test/”ということになります。これはつまり、/test/abc.htmlにアクセスがあったら“abc.html”に対してマッチング(後述)が行われ、リダイレクト先として“xyz.html”が指定されていたら/test/xyz.htmlにリダイレクトされるということです。Apacheで別名(alias)などを利用していると、実階層とURLが一致しない場合もあるため、この設定が用意されています。
- RewriteRule
- 具体的なURL書き換えのルールはRewriteRuleに記述します。書式は、RewriteRule 正規表現 書き換えURL フラグ(省略可)のようになっています。アクセスされた実際のURLが、1番目のパラメータである正規表現にマッチした場合、2番目のパラメータであるURLに書き換えられます。先ほどの設定例では、正規表現ですべてのURLにマッチさせ、これをindex.htmlに書き換えていました。
RewriteRuleの詳細についてはApacheのWebサイトにあるドキュメントを参照してください。
RewriteRule適用の追加条件
RewriteRuleでは、URLが正規表現にマッチしたときに書き換えを行いますが、URL以外の条件(例えばアクセス元のIPアドレスなど)で書き換えするかどうかを決定したい場合もあります。このようなときは、RewriteCondという設定項目を利用して、ある条件に一致する場合のみRewriteRuleを適用するといった設定も可能です。
RewriteCond の書式は、
RewriteCond 判定対象 判定条件
となります。判定対象には、ログ設定のところでも解説した環境変数などが利用できます。判定条件には正規表現などを指定します。例えばアクセス元IPアドレスによって、RewriteRuleを適用するかどうか判断したい場合は、以下のように記述します。
RewriteCond %{Remote_Addr} 192.168.
RewriteRule ^wan.html$ lan.html
このように、対象となる RewriteRuleの前に記述します。上記では、“wan.html”にアクセスがあり、かつそのアクセス元IPアドレスが 192.168.〜だったら、“lan.html”へとリダイレクトしています。
判定条件の部分はやや拡張された正規表現となっており、例えば以下のような表現も可能です。
・パターンに一致しない場合をつかまえたい(先頭に "!" を付加)
RewriteCond %{HTTP_USER_AGENT} !^Mozilla.*
・数値や文字列の大小比較(先頭に ">" や "<" や "=" を付加)
RewriteCond %{TIME_YEAR} >2000
RewriteCond %{TIME_YEAR} <2010
なお、RewriteCondを複数指定した場合には、条件はANDで評価されます(すべての条件が満たされたときにRewriteされる)。条件をORで評価させたい場合は、RewriteCondを“[OR]”でつなぎます。
RewriteCond %{Remote_Addr} 192.168. [OR]
RewriteCond %{Remote_Addr} 10.
RewriteCondの詳細についてはApacheのWebサイトにあるドキュメントを参照してください。
1/3 |
| Index | |
| Apacheとアプリケーションの連携 | |
| Page1 スッキリしたURLの表現を使う 拡張機能「mod_rewrite」でURLを書き換える mod_rewriteの基本 RewriteRule適用の追加条件 | |
| Page2 実際の設定例 PHPの導入(RPM) PHPの導入(ソースから) | |
| Page3 Webアプリケーションへのリダイレクト URLを解析して処理の流れを制御する | |
| Mac OS X関連記事 |
| プログラマーを引き付けるMac OS Xの魅力 続々移行するそのワケとは Mac一筋という熱狂的なユーザーだけでなく、「面白いことをしたい」と考えるエンジニアもMac OS Xを利用し始めている。いったいなぜだろう |
|
| Mac OS XでAMP構築 3通りの方法で整備できる開発環境 Mac OS Xの上にWebアプリケーションの定番、AMP(Apache+MySQL+PHP)環境を3通りの方法で導入してみましょう |
|
| Mac OS Xで動かす軽量プログラミング言語 導入からPHP拡張モジュール組み込みまで Leopardでは、インストール直後からいくつかの軽量プログラミング言語が利用できます。早速試してみませんか? |
|
| Objective-Cは特殊な言語? Cocoaの素、Objective-Cを知ろう(1) iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう |
|
| Mac内にPHP4、5、6を同居させるコツ Mac OS X+PHPでオールインワン環境(インストール編) PHP4の開発は終了したが、移行の問題は残されている。異なるバージョンのPHPをスムーズに切り替えるには? |
|
TechTargetジャパン
- 派生型でもっと便利にデータを扱う (2012/4/26)
基本型を組み合せて使える派生型を学びます。派生型には構造体、共用体、配列などがあります - 実例で学ぶRailsアプリのテスト方法 (2011/12/22)
具体的なWebアプリを例に簡単なテストを使ったリファクタリングについ
て解説する - Railsの人気テストフレームワーク6選! (2011/8/18)
今回からテストを使ったリファクタリングを解説する。まずはRailsで人
気のあるテストフレームワークをいくつか紹介する - ActiveRecordの更新系操作 (2011/6/27)
Railsのモデル層を担当するActiveRecordを使った登録、更新、削除
など、更新系の機能を中心に見ていきます
|
|

