- 2010年6月27日 01:32
- Movable Type
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
何かしらのディレクトリを挟まないといけない理由は…解る人にはわかるのですが、それ以降のアドレスをスクリプトへ投げるからです。
なので、使用していない名前にしてください。
使用しているディレクトリ名を使うとそのディレクトリが使えなくなります。
後、ソースが効率的なのかは解らないので解る人は効率的な書き方があれば教えて下さい。
次はテンプレートの各エントリーへのリンク部分の修正です。
エントリーへリンクを張っているテンプレートのリンク部分を修正してください。
<$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
運営方法についての一文を追加。
- Newer: CPU Clock Ratio 設定が正しく反映しない
- Older: MT ハイフンがアンダーバーになる
Comments:0
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