はじめての DynamicMTML #02 - .htaccess と .mtview.php の役割

前回の記事で、DynamicMTML のインストールまで完了しました。

DynamicMTML を有効にすると、ウェブサイト/ブログのサイト・パス直下に「.htaccess」と「.mtview.php」という2つのファイルが生成されます。今回は、このファイルの役割を見てたいと思います。

.htaccess の役割

この .htaccess には、ユーザーからのリクエストに対して、Apache の mod_rewrite を用いて、その後の動作を振り分ける役割があります。少し踏み込んで具体的に見てみます。

DirectoryIndex に .mtview.php を設定

DirectoryIndex に .mtview.php を設定しています。つまり、/(スラッシュ)で終わる URL のリクエストがあった場合は、.mtview.php に処理を渡すことになります。

mod_rewrite でリダイレクト

サーバーで mod_rewrite モジュールが使える場合のリダイレクトの設定をしています。

具体的には、以下のような条件になっています。

【条件】以下のいずれかの条件に該当する場合は、サイト・パス直下の .mtview.php に処理を渡す

  • リクエストされたファイルが存在しない
  • リクエストされたディレクトリが存在する
  • リクエストされたファイルが拡張子のない状態
  • リクエストされたファイルの拡張子が .html .mtml .HTML .MTML に該当する(初期設定の場合)

mod_rewrite が使えない場合の指定

サーバーで mod_rewrite モジュールが使えない場合の設定もあります。

具体的には、.mtview.php ファイルへのアクセス以外を拒否し、403エラー(Forbidden)、404エラー(Not Found)のエラーページに .mtview.php を指定しています。

PHP の short_open_tag を off

PHP の short_open_tag を off にしています。

short_open_tag を on にすると、<?php ?> だけでなく <? ?> も PHP のコードとみなされます。つまり、XHTML 等の先頭に xml 宣言があると、それも PHP のコードとみなされてしまいます。それを防ぐための設定です。

.mtview.php の役割

.htaccess により転送されてきたリクエストを、.mtview.php が処理します。

この .mtview.php の内容については、話が難しくなるので詳しくは触れませんが、.mtview.php には、ダイナミックにテンプレートを処理するのに必要な情報(blog_id など)と、実際に処理を行うファイルの読み込みをしています。

その後の処理については、以下のドキュメントの「フローチャート」の項を参照してください。

ウェブサイト/ブログごとに DynamicMTML を設定する

複数のウェブサイト/ブログで DynamicMTML を利用する場合は、それぞれの設定画面で DynamicMTML を有効にする必要があります。

以下では、少し話がそれるかもしれませんが、DynamicMTML が実際にどのウェブサイト/ブログのコンテキストで評価されるのか実験してみます。
.htaccess と .mtview.php の流れが分かりやすくなるかもしれません。

サンプルサイトの構成は、以下のようになっています。
ウェブサイトには1つのウェブページ、各ブログには1つのブログ記事が存在します。現時点で、DynamicMTML の設定をしてあるのは、ID が 1 の「はじめての DynamicMTML」というウェブサイトだけです。

  • はじめての DynamicMTML(ウェブサイト:ID=1)
    • ウェブページ#01
    • はじめての DynamicMTML ブログ(ブログ:ID=2)
      • ブログ記事#01
    • はじめての DynamicMTML 日記(ブログ:ID=3)
      • 日記#01

このウェブサイトとブログの各サイト・パス直下に以下の内容の dynamicmtml-listing.html というスタティックな HTML ファイルをアップロードします。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title><$mt:BlogName$></title>
</head>
<body>
    <h1><$mt:BlogName$> (ID:<$mt:BlogID$>)<br />ブログ記事・ウェブページ一覧</h1>
    <p><$mt:Date language="ja"$></p>
    <h2>ブログ記事一覧</h2>
    <mt:Entries>
    <mt:EntriesHeader><ul></mt:EntriesHeader>
        <li><mt:EntryTitle></li>
    <mt:EntriesFooter></ul></mt:EntriesFooter>
    <mt:Else>
        <p>ブログ記事はありません。</p>
    </mt:Entries>
    <h2>ウェブページ一覧</h2>
    <mt:Pages>
    <mt:PagesHeader><ul></mt:PagesHeader>
        <li><mt:PageTitle></li>
    <mt:PagesFooter></ul></mt:PagesFooter>
    <mt:Else>
        <p>ウェブページはありません。</p>
    </mt:Pages>
</body>
</html>
  • /first_dynamic/dynamicmtml-listing.html
  • /first_dynamic/blog1/dynamicmtml-listing.html
  • /first_dynamic/blog2/dynamicmtml-listing.html

このファイルには、ブログ名やブログID、そのブログに含まれているブログ記事とウェブページを表示するテンプレートが書かれています。このファイルの処理結果を見れば、そのファイル(dynamicmtml-listing.html)が、どのウェブサイト/ブログに所属するファイルとして処理されたかが分かると思います。

結果はすべてのページで、以下のように「はじめての DynamicMTML」ウェブサイトのコンテキストとして評価されました。つまり、各ブログの情報にはアクセスできませんでしたね。

startup-dymtml-8

.mtview.php は、ダイナミックにテンプレートを処理するための、blog_id 等の情報が記述されています。したがって、現時点のようにウェブサイトでしか DynamicMTML を設定していないと、ウェブサイトの情報が記述された .mtview.php へ全ての処理が渡されてしまうためです。

そこで、各ブログで DynamicMTML を有効にすれば([全般設定] にある [DynamicMTMLを有効にする] にチェックを入れて保存)、ブログごとに .htaccess と .mtview.php が生成されるので、以下のようにちゃんとブログのコンテキストも取得できます。

startup-dymtml-9

したがって、複数のウェブサイト/ブログで DynamicMTML を利用する場合は、それぞれのウェブサイト/ブログの全般設定で、DynamicMTML を有効にすることを忘れないようにしましょう。

少し無駄な話だったかもしれませんが、.mtview.php の役割も少し見えたと思います。

以上です。
※ちなみに以下の関連記事も DynamicMTML で出力しています。

  • このエントリーをはてなブックマークに追加
Just a second...