検索
連載

ApacheとWebアプリケーションの連携いまさら聞けない!? Web系開発者のためのサーバ知識(4)(3/3 ページ)

ブラウザから渡されたURLの解釈は、Webサーバで行うべきか、Webアプリ(フレームワーク)側で行うべきか。設計上の選択に幅があることをWeb開発者としても理解しておきたいものです(編集部)

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

Webアプリケーションへのリダイレクト

 PHPをインストールしたことでWebアプリケーションが設置可能となりました。まずは、先ほどご紹介したような静的URLを動的URLにリダイレクトする動作を試してみましょう。

 ドキュメントルートに、以下のようにHTTPリクエストの内容を表示する簡単なPHPスクリプト(test.php)と、.htaccess を設置してみます。

●test.php
<?php
var_dump($_REQUEST);
?>
●.htaccess
RewriteEngine On
RewriteRule ^(.+)/(.+)/(.+)$ $1.php?mode=$2&id=$3

 そして、“http://ホスト名/test/edit/123”というURLでアクセスしてみましょう。

array(2) { ["mode"]=>  string(4) "edit" ["id"]=>  string(3) "123" }

 という出力が得られるはずです。mod_rewriteの機能を介して、test.phpというスクリプトに、modeとidという2つのパラメータが渡されていることが確認できます。

URLを解析して処理の流れを制御する

 先ほどの例では、mod_rewiteの機能でURLを書き換えて、最終的な実行スクリプトを特定していました。これだけでも十分に便利なのですが、あえてApache側では複雑な書き換えを行わず、リダイレクト先のスクリプト(Webアプリケーションの入り口)でURLの解析やパラメータの抽出を行うようにすると、より柔軟で複雑な処理の制御が可能となります。ここでは、URLに応じて処理の流れを決める仕組みを、PHPによるごく簡単な例で見てみましょう。

 先ほどのようにドキュメントルートに .htaccessを設置し、すべてのアクセスをある1つのPHPスクリプト(今回の例ではindex.php)にリダイレクトするようにします。そしてそのスクリプトでURLを解釈し、内部でロジックを使い分けるようにしてみましょう。以下のような構成でファイルを作成してみます。

/var/www/html/
  |-- .htaccess
  |-- index.php
  |-- logic/
        |-- Logic1.php
        |-- Logic2.php

 まず .htaccessですが、これは先ほどご紹介した例とほぼ同じになります。ドキュメントルート以下のアクセスをすべて“/index.php”へリダイレクトするのですから、以下のような設定となります。

RewriteEngine On
RewriteBase /
RewriteRule ^.*$ index.php

 次に、“logic/”以下の2つのスクリプトを作成します。本格的なWebアプリケーションをイメージして、それぞれのロジックはクラス(関連性のあるパラメータや関数を1つにまとめて構造化した、プログラムの単位)として作成してみます。といっても、今回はどちらのスクリプトが実行されたかを確認できれば良いので、実装はあくまでも単純な内容です。

●Logic1.php
<?php
class Logic1 {
  private $_mode;
  private $_param;
  public function init($mode, $param) {
     $this->_mode  = $mode;
     $this->_param = $param;
  }
  public function run() {
    echo __CLASS__ . ' が ' .
         htmlspecialchars($this->_param, ENT_QUOTES) . ' を ' .
         htmlspecialchars($this->_mode , ENT_QUOTES) . 'します';
  }
}
?>

 Logic2.phpも上記とほぼ同じ内容で、クラス名のみ“Logic2”として作成してください。

 最後に、index.phpのなかで、URLに応じて先ほどの2つのロジックを使い分けるように実装してみましょう。

●index.php
<?php
$params = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$actionName  = ucfirst($params[0]);
$actionMode  = $params[1];
$actionParam = $params[2];
require_once(realpath(dirname(__FILE__)) . '/logic/' . $actionName . '.php');
$action = new $actionName;
$action->init($actionMode, $actionParam);
$action->run();
?>

 各スクリプトを設置したら、ブラウザから、例えば“http://サーバ名/logic2/edit/123”などのURLでアクセスしてみてください。「Logic2 が 123 を editします」のように、パラメータに応じたロジックが実行されていることが確認できます。

 上記のスクリプトの詳細についての解説は、今回の連載の趣旨から脱線してしまいますので割愛しますが、要はすべてのアクセスをindex.phpに集中させ、そこでURLを解析して、どのロジックを実行すべきかという交通整理を行っているわけです。このような仕組みは、Webアプリケーションのフレームワーク(アプリケーションのベースとなる共通基盤)でもよく見かけます(実際には不正なパラメータが渡された場合の処理など、もっと複雑なロジックとなります)。

 このように、ブラウザから渡されたURLの解釈だけでも、Webサーバでどこまで行い、どこからをプログラム側で行うかといった選択の幅があります。場合によっては、プログラムに書かずにWebサーバに仕事をさせたほうが開発の手間が省けるかもしれません。逆に、なるべく多くをプログラム側で制御できるようにしておきたい場合もあるでしょう。

 今回は、「ある処理を実行させたい」という要望があるとき、プログラミング以外の要素も視野に入れておきたい、という一例として、Apacheのmod_rewriteと、スクリプト処理の簡単なサンプルを、PHPの導入方法も含めてご紹介しました。

著者紹介

竹下 肯己

株式会社 qnote


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る