記事本文
Movable Type 3.1x の個別記事の URI の命名規則
Movable Type 3.x ……としてこの記事を書いても良いのですが、一口にバージョン 3.x と言っても、 3.01D-ja と 3.11 以降では今回触れる件については少々事情が異なるため、バージョン 3.1x についての話とさせていただきます。
Movable Type 3.1x において、個別エントリーアーカイブの出力ファイル名は
- 管理画面
- ウェブログの設定
- アーカイブの設定
- アーカイブ・ファイルのテンプレート
の順番で設定画面をたどり、そこでテンプレートタグを用いて命名規則を決定します。
デフォルトでは空白になっており、またそれによって作成された weblog を一見しただけではどのような規則に基づいているのか推測しづらくなっています。
例えば、 Movable Type Publishing Platform はこの状態で構築されており、 2005 年 6 月の記事の URI を羅列すると次のようになっています。
- Movable Type 3.17日本語版を6月9日に提供開始 ( http://www.movabletype.jp/archives/2005/06/movable_type_31_7.html )
- Movable Type 3.17の提供を開始 ( http://www.movabletype.jp/archives/2005/06/movable_type_31_8.html )
- Movable Type技術情報を更新しました ( http://www.movabletype.jp/archives/2005/06/post_10.html )
一見すると「記事のタイトルから日本語を省いた上で、空白は _ に変換して最初の 15 文字を取り出して、それでも重複していたら _1 や _2 のように接尾語を付けて重複を回避して」命名されているようにも見えますが、 Movable Type技術情報を更新しましたの http://www.movabletype.jp/archives/2005/06/post_10.html のように、そうとも限らない URI になっているものもあります。
実際はデータベース上の entry_basename フィールドを用いて URI が決定されるのですが、それ自体はどのような規則に基づいて決定されているのでしょうか。
entry_basename フィールドの命名規則
Ogawa::Memoranda: Movable Type 3.0のIndividual Entry Archiveの命名方式の問題点に詳しく書かれているので、そちらを読んでいただくと幸いです。 この記事の内容を参考にしたり、自分で試してみたことを簡単にまとめると、
- 下書きとか公開といった状態に関わらず、最初に記事を保存した時点で決定される
- 記事のタイトルが入力されていればそれから決定
- 記事のタイトルが入力されていなけれ本文から決定
- 一度決定された entry_basename は、以後タイトルや本文を修正しても変更されない
- phpMyAdmin を使って直接 entry_basename の値を修正しても、再度記事を保存すると元の entry_basename が使われる
- 日本語は dirify されるため、日本語のみのタイトルや、タイトル未設定時の本文の先頭が日本語のみであった場合は、 post_1, post_2... のように命名される
ということのようです。 おそらく、 Movable Type技術情報を更新しましたの http://www.movabletype.jp/archives/2005/06/post_10.html という URI は、最初は日本語のみのタイトルで下書きをしたといった状況が推測されます。
entry_basename は使わない方が良い
entry_basename による命名規則だと、 http://www.movabletype.jp/archives/2005/06/movable_type_31_7.html のように、 URI 自体に記事の内容が反映されるため、分かりやすくて良いと考えられるかもしれません。 しかし、 entry_basename を一度設定したら容易に変更できない ( Ogawa::Memoranda: mt-resave-entries.cgi: basenameがNULLのエントリを再保存するCGI で変更はできる ) のでは、メリットよりもデメリットの方が大きいと言えます。
また、記事のタイトルを途中で変更していた場合に、記事のエクスポートやインポートを行うと、 entry_basename が変わってしまう可能性も充分に考えられます。 Movable Type 2.x から引き継いで使用している場合は、 entry_id を基に個別記事の URI が命名されていますが、 Junkline - ダサい URI はコロコロ変わるなどのように、これもエクスポート / インポートで変わってしまいます。
お勧めは記事の作成日時で命名すること
私が実際に行っている命名規則ですが、記事の作成日時を基に URI を命名すれば、作成日時を変更しない限りはエクスポート / インポートを行っても URI は変わりません。
hxxk.jp では、個別エントリーアーカイブのアーカイブ・ファイルのテンプレートは
<$MTArchiveDate format="%Y/%m/%d/%H%M"$>.php
という指定にしていますが、そこまで細かくディレクトリを分けなくて良い ( 年別や日別のディレクトリはいらない ) というのであれば、
<$MTArchiveDate format="%Y%m/%d%H%M"$>.html
といった形に適宜変更すると良いでしょう。
Re: エントリーの URL 変更のお知らせ - Focus Pocus.blog
さて、ここからが本題。 エントリーの URL 変更のお知らせ - Focus Pocus.blog を拝見して、
ディレクトリとファイルの名前を同時に変更したので、Google 等のサーチエンジンからの来客が大幅に減。 .htaccess 使えよって話なんですがエントリーの量がそこそこ多いのでOTL
という記述があったので、インデックステンプレートでどうにかならないかなあと思ったので、 entry_basename 周りを調べてみたのです。
で、色々と調査してみた結果、私の環境では .htaccess を自動生成することができました。 次項に手順を示します。
entry_basename による URI からのリダイレクトを行う .htaccess の記述
URI などの環境は Focus Pocus.blog に合わせていますので、参考にされる場合は適宜ご自分の環境に読み替えてください。
「新しいインデックス・テンプレートを作る」をクリックします。
テンプレートの名前を適当な名前にし、出力ファイル名を .htaccess にします。テンプレートの中身に次のようなコードを記述します。
<MTEntries lastn="1000">Redirect permanent <$MTBlogRelativeURL$>archives/<$MTEntryDate format="%Y/%m/"$><$MTEntryBasename$>.html <$MTBlogArchiveURL$><$MTEntryDate format="%Y/%m/%d%H%M"$>.html </MTEntries>
テンプレートを保存し、「このテンプレートを再構築する」をクリックします。
要するに、一度アーカイブ・ファイルのテンプレートの記述を空白にすることで entry_basename による命名に一時的に戻し、それを利用して .htaccess を自動で作成するという手法です。 ( 一部ローカルでの作業が必要になりますが。 ) entry_basename フィールドの値をテンプレートタグで扱えるともう少し楽にできそうなのですが……プラグインの練習で作ってみようかなあ。
<$MTEntryBasename$>
というテンプレートタグを用いて、デフォルトで生成される URI を新しい URI にリダイレクトさせるという手法です。
トラックバック送信先
- エントリーの URL 変更のお知らせ - Focus Pocus.blog
-
一度アーカイブ・ファイルのテンプレートの記述を空白にすることで entry_basename による命名に一時的に戻し、それを利用して .htaccess を自動で作成するという手法はいかがでしょう。

