Home > Movable Type > MT エントリーのURLをURLエンコードで運用する

MT エントリーのURLをURLエンコードで運用する

Movable Type(以下MT)のエントリーURLでURLエンコードを用いて運用する方法の一つを紹介します。
結果的にはwikipediaのようなURLになるとお考え下さい。
注意して欲しいことは、あくまでも運用方法の一つなので参考にする程度で受け止めて下さい。
カテゴリ・月別ページなどは従来のままです。

使用環境

MTバージョン
4.2x
PHP
5.x
(またはPerlでも可能)
mod_rewrite
利用可能であること

メリット・デメリット

メリット
視覚効果
SEO
デメリット
エントリーのタイトルは重複使用できない
負荷微増

対効果で考えれば微妙なので自己満足な方にオススメです。

事前のバックアップはお忘れなく。
もしもの時は戻せるように…。

まずはMT側の準備です。

アーカイブテンプレートのエントリーのテンプレートのアーカイブパスを確認します。
以下を参考に固有の形になるようにしてください。

任意の全エントリー共通ディレクトリ/ベースネーム/index.html(php)

具体例

entry/%b/index.html

http://sample.jp/20100627.html という具合に出力されるものでも、運用は可能ですがFTPで見たときにズラーっとファイルが並ぶのが嫌いなので上のように専用ディレクトリを用いる方法をオススメします。

今回は具体例で示したパスを適応しているとして解説しているので、それ以外の場合は読み替えて下さい。
取り敢えずコチラの説明どおりに実装してから動作を確認してからパスなどを変更することをオススメします。

次はリンク部分の生成です。
専用のテンプレートモジュールを作ることにします。
以下を参考にテンプレートモジュールを生成してください。

テンプレート名: URLエンコードリンク

<MTApplyModifier ltrim="1" strip_linefeeds="1">
 
<MTSetVarBlock name="urlencode_title"><$MTEntryTitle$></MTSetVarBlock>
 
<MTIf name="urlencode_title" like=" ">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/ /g","__--S--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="@">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/@/g","__--A--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="&">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/&/g","__--An--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="'">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/'/g","__--Ap--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="!">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/!/g","__--B--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like=":">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/:/g","__--C--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like=",">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/,/g","__--Co--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="~">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/~/g","__--T--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="=">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/=/g","__--I--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\(">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\(/g","__--KL--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\)">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\)/g","__--KR--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\[">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\[/g","__--K2L--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\]">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\]/g","__--K2R--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\/">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\//g","__--Sr--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\*">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\*/g","__--As--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\+">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\+/g","__--P--__" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="\$">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/\$/g","__--D--__" /></MTSetVarBlock>
</MTIf>
 
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
encode_url="1" /></MTSetVarBlock>
 
<MTIf name="urlencode_title" like="__--S--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--S--__/g","_" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--A--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--A--__/g","@" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--An--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--An--__/g","&" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--Ap--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--Ap--__/g","'" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--B--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--B--__/g","!" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--C--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--C--__/g",":" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--Co--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--Co--__/g","," /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--T--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--T--__/g","~" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--I--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--I--__/g","=" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--KL--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--KL--__/g","(" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--KR--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--KR--__/g",")" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--K2L--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--K2L--__/g","[" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--K2R--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--K2R--__/g","]" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--Sr--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--Sr--__/g","/" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--As--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--As--__/g","*" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--P--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--P--__/g","+" /></MTSetVarBlock>
</MTIf>
<MTIf name="urlencode_title" like="__--D--__">
<MTSetVarBlock name="urlencode_title"><MTGetVar name="urlencode_title" 
regex_replace="/__--D--__/g","$" /></MTSetVarBlock>
</MTIf>
 
<MTIf name="tempName" eq="entry_db">
<MTGetVar name="urlencode_title" />
<MTElse>
<MTBlogURL />db/<MTGetVar name="urlencode_title" />
</MTIf>
 
</MTApplyModifier>

一行目で見て解るとおり、プラグインを導入しています。
これは不要な改行などを削除する為に導入しているので、よろしければ以下からどうぞ。
改行されても気にしない方は一行目と最終行を削除してください。

ApplyModifierプラグイン
http://www.h-fj.com/blog/archives/2007/08/13-102304.php

db/ という記述があるので、「db」の部分は好きに決めて欲しいのですが、後で説明する該当部分も変更をした場合は忘れずに。
何かしらのディレクトリを挟まないといけない理由は…解る人にはわかるのですが、それ以降のアドレスをスクリプトへ投げるからです。
なので、使用していない名前にしてください。
使用しているディレクトリ名を使うとそのディレクトリが使えなくなります。

後、ソースが効率的なのかは解らないので解る人は効率的な書き方があれば教えて下さい。

次はテンプレートの各エントリーへのリンク部分の修正です。

エントリーへリンクを張っているテンプレートのリンク部分を修正してください。
<$MTEntryPermalink$> とかになっているので <$MTInclude module="URLエンコードリンク"$> へ書き換えます。

<$MTEntryPermalink$><br />

<$MTInclude module="URLエンコードリンク"$>

MTの置換機能を使うと楽です。
全ての修正を整えたら参照用のデータベースを作成します。
インデックステンプレートとして作成してください。

テンプレート名: エントリーデータベース
出力ファイル名: entry_db.php
公開: スタティック

<MTApplyModifier trim_ex="ltrim,rtrim,trimcr">
<MTSetVar name="tempName" value="entry_db">
<?php
 
$entry_db = array();
$entry_db[title][] = "error";
$entry_db[basename][] = "error";
$entry_db[urlencode][] = "error";
 
<mtSetVarBlock name="ent_count"><$MTBlogEntryCount$></mtSetVarBlock>
<mt:for var="arc_loop" from="0" to=$ent_count increment="200">
<MTEntries lastn="200" offset=$arc_loop>
$entry_db[title][] = "<$MTEntryTitle$>";
$entry_db[basename][] = "<$MTEntryBasename$>";
$entry_db[urlencode][] = "<$MTInclude module="URLエンコードリンク"$>";
</MTEntries>
</mt:for>
 
?>
</MTApplyModifier>

errorはエントリーが見つからない時に使用される適当な言葉を入れておけばかまいません。
ただし、ここで選択した言葉はエントリーのタイトルとしては使用してはいけません。
以降で説明するスクリプトの書き方次第では不要な部分ですけど…。
ここでもさきほど説明にあがったプラグインを使ってますのでプラグインを使わない方は最初と最後の行を削除して下さい。

これでMT側の準備は完了です。

次にスクリプト側です。
PHPで書かれていますが、Perl用に書き直せばPerlでも運用可能です。

ファイル名: entry_view.php

<?php
 
/* ---------------------------------------------------------------------- */
/* 設定 */
/* ---------------------------------------------------------------------- */
 
// 
$entry_path = "/db/";
 
// 
$entry_dir = "/entry/";
 
// このファイルを設置する場所から entry_db.php までのディレクトリパス
// デフォルトはこのファイルをルートディレクトリに設置した場合の設定
$db_dir = dirname(__FILE__) . "/";
 
// 
$db_file_name = "entry_db.php";
 
/* ---------------------------------------------------------------------- */
 
// タイトルの有無を確認
if (isset($_GET['title']))
{
 
// URLエンコードされたタイトルを取得
$title_url_encode = ereg_replace($entry_path, "", getenv('REQUEST_URI'));
 
}
else
{
 
// 404エラーを通知
header('HTTP/1.0 404 Not Found');
 
exit;
 
}
 
// 
$db_file = $db_dir . $db_file_name;
 
// リストを取得
include_once($db_file);
 
// 変数初期化
$title_url_encode_key_number ="";
 
// 配列Key取得
$title_url_encode_key_number = array_search($title_url_encode, $anime_index_db[urlencode]);
 
// URLの取得に失敗した時
if ($title_url_encode_key_number == "")
{
 
// 404エラーを通知
header('HTTP/1.0 404 Not Found');
 
exit;
 
}
 
// 変数初期化
$entry_basename = "";
 
// ベースネーム(出力ファイル名)取得
$entry_basename = $entry_db[basename][$title_url_encode_key_number];
 
// エントリーページファイルパス取得
$include_file = dirname(__FILE__) . $entry_dir . $entry_basename ."/index.html";
 
// エントリー読み込み表示
include_once($include_file);
 
?>

汚いソースですがこんな感じで処理して表示するスクリプトです。
ファイル名やパスを変更していたらこちらのスクリプトも修正して下さい。
特に下から二つ目のパス部分に注意。

次は mod_rewrite です。
ルートディレクトリに設置するとした設定になっています。

ファイル名: .htaccess

# mod_rewrite設定
RewriteEngine On
RewriteBase /
RewriteRule ^db/(.*)$ /entry_view.php?title=$1 [L]

これで終わりです。
取り敢えずエントリー一つを再構築して確認してみて下さい。
動作しなければ各パスやファイル名をチェックしてみましょう。
書いておいて確認していないのでこちらの記載ミスもあるかもしれません。
その時はご一報下さい。

後、URLが変更になるのでSEO的には以前のURLは301転送するようにしましょう。
mod_rewrite と PHP を用いれば容易です。
ただし、以前のURL構成にもよりますが…。
それからエントリーが呼ばれる度にPHPが走るので以下の様な 304 Not Modified 対策もオススメです。

PHP 304 Not Modified
http://www.fya.jp/blog/2010/05/17/php_304_not_modified/

entry_db.php についてですが、エントリー数が多くなると再構築エラーを招くことになります。
このことから entry_db.php の代わりをエントリーファイル自信にさせればいいという結果に至りました。
これにも問題があってURLエンコードされたエントリーURLに必ず固有の名前を含めることです。
例えばエントリーIDだったり、ベースネーム、年月日時分秒だったりといった固有の名前をURLに含めなければいけない事です。
それを基に entry_view.php でエントリーファイルを参照させることが出来ます。
機会があれば詳しく記載します。

2010.06.30
各所に少し修正を加えました。

2011.01.17
運営方法についての一文を追加。

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
https://www.fya.jp/cgi-bin/mt/mt-tb.cgi/98
Listed below are links to weblogs that reference
MT エントリーのURLをURLエンコードで運用する from Minase's Blog - FYA

Home > Movable Type > MT エントリーのURLをURLエンコードで運用する

Search
Feeds

Return to page top