Entry

Movable Type のタグページのアドレスを書き換える

Movable Typeにはタグ機能がある。
「タグ」とは言っても、<>で囲まれるアレではなくて、エントリーに対して設定するキーワード機能。両者とも ラベル付けするといった意味の「タグ」ではあるのだけど。以前、Movable Typeはこのタグ機能を「エントリータグ」、テンプレートに使うタグを「テンプレートタグ」または「タグ」と呼称していたけど、今は逆に「タグ」と呼ぶと「エントリー・タグ」の方を指すようだ。っていうか、ヘルプから「エントリータグ」の名称がスッパリ消えてる。

さて、このタグ機能。特定のタグを含むエントリーの一覧ページへのリンクを作りたい場合、そのアドレスはMovavle TypeのテンプレートからMTTagSearchLinkを呼び出せばいい。しかしこの場合、アドレスは”http://xxx/mt-search.cgi?tag=xxx&blog_id=1″という感じで出力されてくる。
これは要するに、「作成した複数のブログの中からID=1に該当するブログで、かつタグ名xxxを持つエントリーを探す」ことを意味する。要は、検索機能を応用したもの。

困ったことに、サイトを移転すると設定によってはIDが変更されてしまう場合があり、「blog_id=1」(「IncludeBlogs=1」の場合もあり)の部分で引っかかってくる可能性がある。というか、実際に最近移転の際に引っかかった。こうなると旧来のアドレスは使えなくなる。リンク設定とか色々面倒くさいし、検索エンジンからの来訪者にも悪い。IDが異なるだけで以前のアドレスが使えなくなるのは、馬鹿馬鹿しいにも程がある。
なるべく環境依存の要素を排除したい自分としては、このMTTagSearchLinkによって作られるアドレスは好ましくない。そんなわけで、.htaccessをいじってアドレスを偽装(人聞きが悪い)することにする。

アドレスの変更

今回、タグページのアドレスを以下のように変更することにした。

“http://melog.info/mt/mt-search.cgi?tag=xxx&blog_id=1”

“http://melog.info/archives/tags/tag=xxx”

これは、タグページのアドレスをarchivesディレクトリ以下にすることでアーカイブの一部として見せかけること、クエリを示す「?」を排除して検索エンジンに拾われやすくすること、IDを削除すること、といった目的がある。実は最初、”http://melog.info/archives/tags/xxx”というアドレスに設定しようと思ったけど、「.htaccess」「.htpasswd」といったタグへのアクセスは弾かれてしまうし、「index.html」といったタグが存在した場合に処理がややこしくなるため、頭に「tag=」を付けることにした。.htaccessをいじって回避させることもできるけど、あまりイレギュラーな設定をすると後で困りそうだし、セキュリティ上好ましくないため、やめた。

とりあえず”tags”ディレクトリを作成し、index.htmlのみ配置。
ここで、.htaccessに以下のような記述を追加する。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/archives/tags/index.html$
RewriteRule ^archives/tags/tag=(.*)$ mt/mt-search.cgi?tag=$1&blog_id=2 [L]

これで、”http://melog.info/archives/tags/tag=xxx”のアドレスにアクセスすると、”http://melog.info/mt/mt-search.cgi?tag=xxx&blog_id=2″のデータが表示されるようになる。
ついでに、過去のアドレスにアクセスした場合、現在のアドレスにリダイレクト(転送)されるような設定も追加する。

RewriteEngine On
RewriteCond %{QUERY_STRING} .*tag=(.*)\&blog_id=3.* [OR]
RewriteCond %{QUERY_STRING} .*tag=(.*)\&IncludeBlogs=3.*
RewriteRule ^mt/mt-search.cgi$ /archives/tags/tag=%1%2? [R=301]

ええ、昔はID=3でした。今は2です。本当は1にしたかったのだけど、どうしてもMovableTypeで最初に強制的に作られる初期ユーザーが1になってしまうので諦めた。
ちなみに、RewriteRuleの転送先は末尾に「?」を付けないと、転送元のクエリがそのまま残ってしまうという不思議な挙動が見られる。そういう仕様だそうだけど、何だかなぁ…。あとこれ、下手をすると無限ループが発生するので注意。mod_rewrite難しい。

リンクの変更

タグページが本来のアドレスではなくなったので、当然アドレスの取得にMTTagSearchLinkは使えない。…いや、別に従来のアドレスが消滅したわけではないので使えないわけではないけど、それでは意味がない。そこで、代替手段で何とかする。
タグページのアドレスにある「tag=xxx」のxxxは、タグ名をURL用にエンコードした値が使われている。そこでMTTagNameをURL用にエンコードして取得する。

<$MTBlogArchiveURL$>tags/tag=<$MTTagName encode_url="1"$>

encode_urlは、MovableTypeにおけるテンプレート要素の汎用属性。対象の値をURL用の値に変換してしまう。これで、”http://melog.info/archives/tags/tag=xxx”というアドレスが確保できる。あとはこれをaタグのhref属性に入れるなり何なりすればいい。

そんなわけで、タグを含むエントリー一覧のアドレスを操作するお話でした。

追記

敗…。
このやり方だと、apacheタグ名に”/”(スラッシュ)があると上手く転送されないことが判明。

kawama.jp: PATH_INFOに「%2F」が含まれていると404エラーになる(AllowEncodedSlashesで解決)

つまるところ、パスの中に「%2F」が存在している事が駄目らしい。クエリの中なら大丈夫だったのだけど…。
解決にはapacheのVer.2.0.46以降で、AllowEncodedSlashesをONにする必要があるそうだけど、今使われているapacheのバージョンは1.3.37…さて、どうしたものか。

ちなみに、「%2F」ではなく「%252F」と書くと上手く動いてくれる。%2FをさらにURLエンコードしたもの。
これを何とか適用させる方法を考えるか…。

Comments (1 件)

Movable Typeのタグページを静的ページで表示

SEO対策&アドレスをすっきりさせるため、 Movable Typeのタグページ…

コメントを残す

メールアドレスが公開されることはありません。