デフォルトの個別エントリーアーカイブから URI を変更する場合の注意点

http://hxxk.jp/2005/06/12/1509

記事データ

投稿者

望月真琴

投稿日時

2005-06-12T15:09+09:00

タグ
概要

Movable Type 3.1x では entry_basename を元に個別エントリーアーカイブの URI を決定しますが、これがなかなか曲者なのです。

リプライ

3 件のリプライがあります。

記事本文

Movable Type 3.1x の個別記事の URI の命名規則

Movable Type 3.x ……としてこの記事を書いても良いのですが、一口にバージョン 3.x と言っても、 3.01D-ja と 3.11 以降では今回触れる件については少々事情が異なるため、バージョン 3.1x についての話とさせていただきます。

Movable Type 3.1x において、個別エントリーアーカイブの出力ファイル名は

  1. 管理画面
  2. ウェブログの設定
  3. アーカイブの設定
  4. アーカイブ・ファイルのテンプレート

の順番で設定画面をたどり、そこでテンプレートタグを用いて命名規則を決定します。

アーカイブ・ファイルのテンプレートの欄はデフォルトでは空白となっています デフォルトでは空白になっており、またそれによって作成された weblog を一見しただけではどのような規則に基づいているのか推測しづらくなっています。 例えば、 Movable Type Publishing Platform はこの状態で構築されており、 2005 年 6 月の記事の URI を羅列すると次のようになっています。

  1. Movable Type 3.17日本語版を6月9日に提供開始 ( http://www.movabletype.jp/archives/2005/06/movable_type_31_7.html )
  2. Movable Type 3.17の提供を開始 ( http://www.movabletype.jp/archives/2005/06/movable_type_31_8.html )
  3. 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の命名方式の問題点に詳しく書かれているので、そちらを読んでいただくと幸いです。 この記事の内容を参考にしたり、自分で試してみたことを簡単にまとめると、

ということのようです。 おそらく、 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 に合わせていますので、参考にされる場合は適宜ご自分の環境に読み替えてください。

  1. 「新しいインデックス・テンプレートを作る」をクリック「新しいインデックス・テンプレートを作る」をクリックします。
  2. 「新しいインデックス・テンプレートを作る」をクリックテンプレートの名前を適当な名前にし、出力ファイル名を .htaccess にします。テンプレートの中身に次のようなコードを記述します。
    <MTEntries lastn="1000">Redirect permanent <$MTBlogRelativeURL$>archives/<$MTEntryDate format="%Y/%m/"$><$MTEntryBasename$>.html <$MTBlogArchiveURL$><$MTEntryDate format="%Y/%m/%d%H%M"$>.html
    </MTEntries>
  3. テンプレートを保存し、「このテンプレートを再構築する」をクリックテンプレートを保存し、「このテンプレートを再構築する」をクリックします。

要するに、一度アーカイブ・ファイルのテンプレートの記述を空白にすることで entry_basename による命名に一時的に戻し、それを利用して .htaccess を自動で作成するという手法です。 ( 一部ローカルでの作業が必要になりますが。 ) entry_basename フィールドの値をテンプレートタグで扱えるともう少し楽にできそうなのですが……プラグインの練習で作ってみようかなあ。

<$MTEntryBasename$> というテンプレートタグを用いて、デフォルトで生成される URI を新しい URI にリダイレクトさせるという手法です。

トラックバック送信先

エントリーの URL 変更のお知らせ - Focus Pocus.blog

一度アーカイブ・ファイルのテンプレートの記述を空白にすることで entry_basename による命名に一時的に戻し、それを利用して .htaccess を自動で作成するという手法はいかがでしょう。

リプライ

3 件のリプライが送られています。

2005-06-12T20:15+09:00 - Linear

はじめまして。 .htaccess をテンプレートから作るっていうのは盲点でした。確かにこれならいくらエントリーがあっても一発でリダイレクトできるようになりますね。 早速そのようにやってみると上手くいきました。感謝です。

2005-06-13T01:10+09:00 - 真琴

解決したようで何よりです。 ……が、どうも &#60;&#36;MTEntryBasename&#36;&#62; を使えそうな感触です。 ( 今さら ) ちょっとこの辺を試してみて追記しますー。

2005-06-13T01:30+09:00 - 真琴

やはり &#60;&#36;MTEntryBasename&#36;&#62; というテンプレートタグが存在しました。もっと早く気付いていれば Linear さんに余計な手間をかけさせずに済んだのですが……面倒な方法を紹介して申し訳ありません。

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など