Movable Typeをhtmlからphp化する方法と.htaccessを使ったURL転送

当ブログではMovable Type(MT)をブログシステムとして使っていますが、別のサイトでMTをhtmlからphpに変更しました。

というのも、基本的にMTは再構築しないとサイト全体が最新になりません。

しかし、php化することによって、エントリーを投稿してすぐにサイト全体に最新情報が反映されます。

サイト全体で共通として使っているサイドバーなどに修正を加えた場合も、php化していれば再構築せずに修正が反映されます。

phpはCGIに比べてサーバーにかかる負担も少ないですし(というか、ほとんどhtmlサイトと同じ)、メリットが多いんですね。

特に、当ブログのように記事数が1000を超えると、再構築自体にすごく時間がかかります。

当ブログもいずれphp化しようと思っています。

php化すると、ファイルの拡張子が「.html」から「.php」に変更します。すると、いろいろと問題が出てくると思うのですが、その辺の解決法も書いています。

ただし、Movable Type(MT)のバージョン3.2から4.1が対象になります。

最新のバージョン4.2は、だいぶ変わってしまったので、これから書く方法が正常に動作するかどうか分かりません。

では、まずは、MTの管理画面内の設定手順について。


(1)拡張子を「html」から「php」に変更

「設定」→「公開」で「アーカイブの拡張子」を「html」から「php」に変更し、ページ下の「変更を保存」ボタンをクリック。(この時点では再構築しなくてOKです。)

「アーカイブの拡張子」を「html」から「php」に変更

すると、「アーカイブ・マッピング」にある「出力フォーマット」の拡張子が「.html」から「.php」に変更します。

「出力フォーマット」の拡張子を「.html」から「.php」に変更

次に「テンプレート」ページに移動し、「メインページ」をクリック。

「出力ファイル名」を「index.html」から「index.php」に拡張子を変更して「保存」ボタンをクリック。

「index.html」から「index.php」に拡張子を変更

他にも自分で作ったhtmlテンプレートがあったら、同様に拡張子を「.html」から「.php」に変更します。

ここで一旦、すべてを再構築をしてみましょう。

もし、あなたのサイトのURLが

Example Domain

なら、

Example Domain

でも

Example Domain

でも表示されるはずです。

2つの拡張子で確認してみて下さい。

これはトップページだけでなく、カテゴリページ、月別アーカイブ、個別ページも同様です。

つまり、過去の投稿したものに関しては、「.html」ファイルと「.php」ファイルの2つが存在しているということです。

そして、この時点で、今後のMovable Type(MT)での投稿は、phpファイルのみが出力されるようになります。

最後に気を付けなければならないことは、HTMLファイルの一番上でXML宣言をしている場合は、php化に伴いXML宣言部分をちょっと修正する必要があります。

<?xml version="1.0" encoding="<$MTPublishCharset$>"?>

<?php echo '<?xml version="1.0" encoding="<$MTPublishCharset$>"?>'?>

と書き換えます。

XML宣言をしている場合は、この書き換えをしないとエラー表示されてしまいます。

これでもまだ正常にページが表示されない場合は、ファイルのパーミションの可能性が高いです。

Movable Type(MT)はphpファイルのパーミションを「666」もしくは「644」で出力します。

レンタルサーバーによってはこのパーミションだと「500 Internal Server Error」を返すところもあるので。

この場合は、お使いのレンタルサーバーのphpのパーミションを調べるか問い合わせて、レンタルサーバーの仕様に合わせる必要がありますね。

(2)外部ファイルをphpのコマンドで読み込む

Movable Type(MT)では、サイドバーのようなサイト全体で共通の部分は外部ファイルにして読み込むことができます。

1つの外部ファイルをすべてのページに読み込むことによって、修正が1つのファイルで済み、サイトの運営が効率的になるからです。

Movable Type(MT)で外部ファイルを読み込むには以下の2つの方法があります。

・「テンプレートを新規作成」で作ったファイルを読み込む場合

<$MTInclude file="ファイル名"$>

・「モジュール」を読み込む場合

<$MTInclude module="ファイル名"$>

でも、これらの外部ファイルを修正した場合、再構築をしないと修正が反映されません。

記事数が1000を超え、再構築に10分以上かかる場合は、修正の反映を確認するだけで再構築の10分を待たなければならず、かなりストレスです。

そこで、せっかくファイルの拡張子をphp化したので、phpの読み込みコマンドを使って外部ファイルを読み込むことにします。

これによって、外部ファイルを修正した場合、そのファイルだけを再構築すればサイト全体に修正が反映されます。

MTの「すべてを再構築」をする必要がないんですね。

これが、Movable Type(MT)のphp化の一番のメリットだと僕は思います。

phpの外部ファイル読み込みコマンドは次のタグを読み込みたい場所に記述します。

<?php readfile('<$MTBlogURL$>ファイル名'); ?>

これは、Movable Type(MT)の場合なので、「<$MTBlogURL$>」というタグが書かれています。

「<$MTBlogURL$>」は、MTで構築したサイトのトップページのURLを表示してくれます。

もし、あなたのサイトのURLが

Example Domain

なら、

「<$MTBlogURL$>」の部分にこのトップページのURLが出力されるようになります。

そして、読み込みたい外部ファイルが「module_header.php」というファイル名なら、

<?php readfile('<$MTBlogURL$>module_header.php'); ?>

と読み込みたい場所に記述します。

外部ファイル読み込みのソースコード

上の図だと、ピンクのラインの部分です。

各ファイルの外部ファイル読み込みのタグを上記の図のように修正したら、そのファイルを「保存と再構築」します。

通常、読み込まれる側(今回の場合は「module_header.php」)の拡張子はなんでもいいのですが、今回は後ほど「.html」に飛んできたユーザーを「.php」に転送させるので、拡張子は「.php」にしておきます。

つまり、すでに「テンプレートを新規作成」で作ったファイルを外部ファイルとして読み込んでいる場合は、それらのファイルの拡張子を「.php」に変更する必要があります。

「モジュール」で作った外部ファイルを読み込んでいる場合は、テンプレート画面で「テンプレートを新規作成」をクリックして、新たに外部ファイルを作ります。もちろん、拡張子は「.php」です。

下の図はフッター、ヘッダー、左カラム、右カラムを外部ファイルとして新規で作った時のものです。

「テンプレートを新規作成」で作ったファイル

最後に、すべてのファイルを再構築して出来上がりです。

と言いたいところなんですが、まだなんですね。

最後にHTMLファイルが表示されたら、同じページのphpファイルに転送する設定が必要になります。

(3)旧「.html」アドレスから新「.php」アドレスへ転送する

まずは、「.htaccess(ドットエイチティーアクセス)」ファイルを作ります。

「テンプレート」画面で「テンプレートを新規作成」をクリックして、

テンプレート名:htaccess
出力ファイル名:.htaccess

と入力します。

「出力ファイル名」は最初に「.(ドット)」が入っているのがポイントです。

そして、「テンプレートの内容」に以下のように記述します。

DirectoryIndex index.php index.html
RedirectMatch permanent (.*)\.html$ $1.php

そして、「保存」→「再構築」して下さい。念のため、この時点で「すべてを再構築」した方がいいかもしれません。

上記の2行を記述した「.htaccess」ファイルは、ローカルに保存はしない方がいいと思います。というのも、テキストエディタによっては「\(バックスラッシュ)」が「¥」に変換されてしまうからです。

1行目のコマンドは「/」でアクセスされた場合に最初は「index.php」を探し、次に「index.html」を探すという命令です。つまり、左から順に探しています。

たとえば、

Example Domain

にアクセスしたら、最初に

Example Domain

を探し、このファイルがなければ

Example Domain

を探しに行くといった具合です。

2行目のコマンドの「RedirectMatch permanent」は「URLが永久的に移動した」ということを伝えるものです。

専門的に言うと、HTTPレスポンスヘッダで「301 Moved Permanently」(永久的な移転)ステータスを返すと言います。

SEOの世界の「301リダイレクト」と同じなので、「.html」ファイルと「.php」ファイルで重複コンテンツになりません。

Google:301 リダイレクト (完全に移動) の実装

検索エンジンの結果で表示されるページの URL を変更する必要がある場合は、サーバー サイドの 301 リダイレクトを使用することをお勧めします。これは、ユーザーや検索エンジンに正しいページが渡されることを保証する最善の方法です。301 ステータス コードは、ページが新しい場所へ完全に移動したことを意味します。

Yahoo!:ウェブページのURLを変えたので、検索結果のURLを修正したい

Yahoo!検索の検索結果に表示されているウェブページのURLが変わるときは、変更前のウェブページから変更後のウェブページへ「301リダイレクト(301 Moved Permanently)」の設定で自動的に転送されるようにリダイレクトを設定してください。
クローラーは、インデックス更新の際、変更前のウェブページからのリンクをたどって変更後のURLのウェブページを巡回します。

Yahoo!:リダイレクトの設定とインデックスに登録されるURL

あるウェブページにリダイレクトが設定されている場合、クローラーは、次のステータスコードをもとに、リダイレクト先のURLをインデックスに登録するか、リダイレクト元のウェブページをインデックスに登録するかを判定します。

上記のようにグーグルやヤフーといった検索エンジンは、そのページのステータスコードを見ています。

つまり、「.html」から「.php」へのリダイレクト設定の完了後に、

Example Domain

のステータスコードが「301 Moved Permanently」になっていればよいということです。

下記のサイトでページ事のステータスコードを調べることができます。

View HTTP Request and Response Header

僕はここ最近、2つのMTで構築したサイトをphp化しましたが、上のサイトでチェックしたら「HTTP Response Header」で「HTTP Status Code: HTTP/1.1 301 Moved Permanently」を返しています。

HTTPのステータスコードに関しては

HTTPのステータスコード : IT用語辞典

を参考に。

そして、「(.*)\.html$ $1.php」の部分は「.html」ファイルにアクセスしたら「.php」ファイルに転送するというコマンドです。

つまり、

Example Domain

にアクセスしたら、自動的に

Example Domain

に転送(リダイレクト)されます。

Example Domain

にアクセスしたら、自動的に

Example Domain

に転送(リダイレクト)されます。

で、この「.htaccess」ファイルはアップロードした下にあるディレクトリすべてに有効なんです。

つまり、「.htaccess」ファイルはアップロードした場所がルートである

Example Domain

なら、そのサイトのすべてのページに有効だということです。

そこで、拡張子を「.html」から「.php」に変更していないページがあると、「404 not found」になります。

なので、「404 not found」ページを用意していない人は、この機会に「404 not found」ページを作ってしまった方がいいかもしれません。

(4)「404 not found」ページの作り方

MTでの「404 not found」ページの作り方は簡単です。

「テンプレート」画面で「テンプレートを新規作成」クリックして、

テンプレート名:404.php
出力ファイル名:404.php

とします。

「テンプレートの内容」にはindex.phpを改造したものを入力するといいでしょう。

普通なら、

「404 not found.
リクエストされたページは存在しません。」

みたいなコメントが表示されますね。

ナビゲーションなども表示してあげるとユーザビリティに優れたサイトになります。

そして、「保存」→「再構築」します。

次に先ほど作った「.htaccess」ファイルに次の1行を付け加えます。

ErrorDocument 404 /404.php

これで、存在しないページが表示されたら、404.phpページが表示されるようになります。

つまり、最終的な「.htaccess」ファイルに書かれている内容は以下のようになります。

htaccessファイルの内容