.htaccess によるリダイレクト
PHPモジュール化やページ分割のカスタマイズを行った場合、ファイルの拡張子が .html から .php に変更になります。拡張子を変更すると、他サイトからそのファイルにリンクを貼っている場合、デッドリンク(404 Not Found)になってしまいます。
ここでは .htaccess を用いたリダイレクト(転送)によりデッドリンクを回避する方法を紹介します。
動作を簡単に説明すると、.htaccess という特殊なファイルに
hogehoge.html へのアクセスを hogehoge.php に転送する
という内容を設定し、一定の場所に配置しておくだけで hogehoge.html へのアクセスが自動的に hogehoge.php に転送されます。hogehoge.html の実体がなくても大丈夫です。
1..htaccess のフォーマット
.htaccess でリダイレクトをするための正式なフォーマットは、
RedirectPermanent URL-path URL
となります。URL-path が元URL、URLが転送先URLです。例えば archives/hogehoge.html を 同じディレクトリの hogehoge.php に転送する場合は
RedirectPermanent /blog/archives/hogehoge.html http://user-domain/blog/archives/hogehoge.php
という内容になります。ドメインを移行する場合も同様です。
フォーマットの URL-path は、ドキュメントルートからのパス(root からの絶対パスではありません)を指定し、先頭に "/" を付与してください。「ドキュメントルート」とはWebサーバがHTMLファイルを公開するためのディレクトリを意味します。
もう少し具体的に説明します。上記の例ではドメインが
http://user-domain/
で、そのドキュメントルートが
/path/to/htdocs
と仮定します。
ドメイン(つまりドキュメントルート)の配下に blog というディレクトリを作り、そこにブログの index.html が配置されている場合、index.html までの絶対パスは
/path/to/htdocs/blog/index.html
となります。この場合 .htaccess に記述すべき URL-path は、
/blog/~
と、/blog で開始させます。これが前述の「ドキュメントルートからのパス」という意味です。
ドキュメントルート直下、つまり /path/to/htdocs 直下に index.html を配置している場合は .htaccess に /blog を記述する必要はありません(ただし archives ディレクトリ等がある場合はそれを記述します)。
2..htaccess のアップロード先
.htaccess をアップロードするディレクトリは、ドキュメントルートでも、サイト・パス(ブログの index.html があるディレクトリ)でも大丈夫です。
3..htaccess 生成
.htaccess のリダイレクトの設定は、1ファイルに対して1行ずつ書かなければなりません。例えば、エントリーアーカイブ100ファイルを転送する場合、転送の設定を100行書く必要があります。
この手間を省くためにインデックステンプレートを用いて .htaccess ファイルを一気に生成します。
以下、.htaccess の作成手順です。
3.1 .htaccess 用テンプレート作成
管理メニューの「テンプレート」→「インデックス」で「テンプレートを新規作成」をクリックし、次ページで下記を設定します。
- テンプレート名:リダイレクト(何でもいいです)
- ファイル:htaccess.txt
- テンプレートの内容:下記
<MTArchiveList archive_type="Individual">
RedirectPermanent /blog/archives/<$MTArchiveDate format="%Y/%m"$>/<MTEntries><$MTEntryLink$></MTEntries> <$MTBlogURL$>archives/<$MTArchiveDate format="%Y/%m/%d_%H%M"$><MTEntries>.php</MTEntries>
</MTArchiveList>
<MTArchiveList archive_type="Category">
RedirectPermanent <$MTArchiveLink$>index.html <$MTBlogURL$>archives/cat<$MTCategoryID$>/index.php
</MTArchiveList>
<MTArchiveList archive_type="Monthly">
RedirectPermanent <$MTArchiveLink$>index.html <$MTBlogURL$>archives/<$MTArchiveDate format="%Y/%m"$>/index.php
</MTArchiveList>
リストは上から順に、エントリーアーカイブ/カテゴリー・アーカイブ/月別アーカイブを転送する設定になっています。転送が必要なアーカイブのみを設定してください。
3.2 注意事項
このリストは旧URLのファイル名をデフォルトの状態で生成していることを前提に作っており、この場合2つの注意事項があります。
まずこのファイルの生成は、管理メニューの「設定」→「公開」→「アーカイブ・マッピング」の「出力ファイル名」で新ファイル名を設定する前に行う必要があります。理由は旧ファイル名の生成に MTEntryLink を使用しているためです(MTEntryPermaLink を使っても構いません)。
もしすでに変更してしまっていたら「出力フォーマット」を一旦元の状態に戻して、このインデックステンプレートだけを生成するという手もあります(その際、他のアーカイブテンプレートを再構築しないように注意しましょう)。
もうひとつは、MTタグを使って URL-path を自動的に生成していますが、残念ながらMTタグのみで「ドキュメントルートからのパス+ファイル名」というフォーマットを生成することはできません(いわゆるURL形式で生成されます)。したがって、エントリーアーカイブについては MTEntryLink、カテゴリー・アーカイブ/月別アーカイブについては MTArchiveLink を使い、ファイルを生成した後、任意のエディタで開き、リダイレクトの設定で不要なドメイン部分を削除します。
上記とは別に、すでに「出力フォーマット」欄でファイル名を変更している場合は、URL-path の部分を適宜変更してください。また新URLについてもご自身の設定内容にあわせて適宜修正してください。
3.3 その他
この作業は一度でうまくいかないと思いますので、実際の新旧ファイル名と見比べながら、ファイルに設定したタグを修正することをお勧めします。またこの作業を行う前に、試しに各アーカイブについて1ファイルずつ手書きで .htaccess のリダイレクト設定を行ってみて、旧URLを開いた時に新URLへ転送されることを確認するのも良いでしょう。
4..htaccess アップロード
ファイルの内容がきちんとできたら保存・再構築し、出来上がったファイルを任意のエディタ(メモ帳)等で開き、ファイル名を .htaccess に変更して保存します。すでに .htaccess がある場合は、そのファイルに先の内容を追加します。
テンプレートの出力ファイル名をいきなり .htaccess として保存することも可能ですが、生成された瞬間に設定が有効となるので、一旦別のファイル名で作ることをお勧めします。
5.動作確認
できあがったファイルを .htaccess にリネームして、サイト・パス(index.html があるディレクトリ)にアップロードします。これで旧エントリーアーカイブ(.html)等にアクセスしてみてください。.php のファイルにアクセスできれば成功です。
6.Redirect と RedirectPermanent の違いについて
他のサイトを検索すると、Redirect ディレクティブと RedirectPermanent ディレクティブを使っている例がみられました。Apache2.0 のドキュメントを見てみると、たしかに
- RedirectPermanent 元URL 転送先URL
- Redirect permanent 元URL 転送先URL
の2つの設定方法がありますが、いずれも 301(永久に移動)のHTTPステータスコードを返すので、私の誤解がなければ振る舞いは全く同じです。ただし Redirect ディレクティブに permanent を付与しない場合は 302(一時的な移動)というHTTPステータスコードになりますのでご注意ください。
参考サイトは下記です。ありがとうございました。
- ARTIFACT:MovableTypeのページ分割/Permalinkの変更
- 我楽:PHP化とページ分割。
- Pega Weblog:MTのPHP化?.htaccess編
- Apache HTTP サーバ バージョン 2.0 ドキュメント:Redirect ディレクティブ
- Apache HTTP サーバ バージョン 2.0 ドキュメント:RedirectPermanent ディレクティブ
- Movable Type 4 の PHP モジュール化
- MTInclude タグによる SSI(サーバサイドインクルード)不要なインデックステンプレートのモジュール化
- Movable Type の PHP モジュール化の仕組みについて(その4:再構築オプション利用方法)
- Movable Type の PHP モジュール化の仕組みについて(その3:変更方法)
- Movable Type の PHP モジュール化の仕組みについて(その2:具体的動作とMTIncludeとの違い)
- Movable Type の PHP モジュール化の仕組みについて(その1:概要)
- テンプレート・モジュールの利用
≫ 各種パスと Movable Type のテンプレートタグ from hxxk.jp
ユーザマニュアルに MTBlogRelativeURL というテンプレートタグが記載されています。これを使えばドキュメントルートからの相対パスの記述を MT テ... [続きを読む]
≫ MovableTypeのPHP化 from フォトショップを使い「こなす」ブログ
興味はあったものの、ややこしそうだったので後回しにしていたMovableType... [続きを読む]
≫ アーカイブのPHP化と「.htaccess」 from Project MultiBurst
以前から考えていましたが、なかなか理解できていなかったのと、 暇がなかったのもあってやれなかったことがあります。 それは、 『アーカイブのPHP化とページ... [続きを読む]
≫ Movable Type カスタマイズ一覧 from Eternal World
当サイトはMovable Typeを利用していますが、 快適な運用を行うために、... [続きを読む]
≫ Movable Typeの携帯対応化について考えてみる from Free Style IIDX
基本htmlな構成だが、TOPだけはphpで、携帯端末からのアクセスした場合、 ... [続きを読む]
≫ MTをphp化しました。 from RedLine Magazine
昨日のエントリで「やっぱりphpにしとけばよかった」と、ぶつぶつ言ってみたので只... [続きを読む]
≫ リダイレクト(まとめ) from SEO アクセスアップ ウェブのしあわせ
PHPで301リダイレクトを行う方法 ⇒サイト移転時の301リダイレクト処理の具体例:phpspot開発日誌 [続きを読む]
≫ MT FC2ブログ : 記事の移行の注意点(インポート エキスポート) from kubolog - クボログ:久保のブログ -
「kubolog - クボログ:久保のブログ - 」は、 2007 3/25にF... [続きを読む]
≫ MT FC2ブログ : 記事の移行の注意点(インポート/エキスポート) from kubolog - クボログ:久保のブログ -
「kubolog - クボログ:久保のブログ - 」は、 2007 3/25にF... [続きを読む]
≫ ダイナミックパブリッシング化&PHP化 from ムジログ
Movable Typeにしてから最も不満だったのが、再構築の時間が長いという... [続きを読む]
≫ htaccessでリダイレクション from web daily life
ブログのphp化をする際に、それぞれの個別記事やアーカイブなどのアドレスが変わっ... [続きを読む]
≫ 【htaccess】ブログの引越しです。【リダイレクト】 from ガラクタ知識
ブログの引越しでhtaccessを使って既存の記事から引越し先にリダイレクトさせました。(←日本語でおk) [続きを読む]
≫ .htaccess で移転先URLページへ誘導する:MT4.1 from Atelier
MT4.1 で「小粋空間」さんのテンプレート・セットに移行したときに、ブログ名... [続きを読む]
≫ ドメイン移行時に旧サイトへのアクセスを新ドメインへ転送する方法。(.htaccessを利用したリダイレクト設定) from PC Portal
サブドメインで運営していたサイトを新規ドメインを取得して移行しました。 この移行時に問題となったのが、新ドメインに移行すると旧ドメインで貼られているリン... [続きを読む]
うぃー。ご無沙汰ですー。
これって、ぐぐる先生に嫌われるとか嫌われないとか。どんなもんなんでしょうねぇ。
私はgoogleからの訪問が激減りしてたので、このリダイレクトを最近やめてみましたが、その結果どうなるかはまだ結果わかりましぇん。
>Border.さん
こんにちは。
ごぶさたです。(笑)
リダイレクトどうなんでしょう。
私の旧サイトからのリダイレクトはPageRankには影響なかったようです(検索結果の方は不明)。
最初からドメインとファイル名を確定させるのが一番大事かもしれませんね(これが難しいのですが)。
こんにちは、毎回参考にさせてもらってます。
個別エントリー(エントリー番号を使った場合)と月別・日別エントリーに関しては RedirectMatch (正規表現)が使えるんじゃないでしょうか。
URIの表現がそうそう変わるわけではないので、わざわざMTタグでURIを作る必要性は低いんじゃないかな、と思いました。(行がものすごく多く必要だし)
例えば <$MTBlogURL$>archives/archives/000123.html を 000123.php にリダイレクトする場合、
RedirectMatch ([0-9][0-9][0-9][0-9][0-9][0-9])\.html$ <$MTBlogURL$>archives/$1.php
にするとか。(.htaccess を <$MTBlogURL$>archives/ に置いた場合)
※左項の( )が右項の$1に差し替えられます。
( )は何度も使えます。(右項で$2,$3...とする)
まあ、カテゴリアーカイブURIをサブカテゴリ対応に変えた場合は対応しようがありませんが、そうでなければカテゴリアーカイブでも使えそうですね。
>やすひささん
こんにちは。
アドバイスありがとうございます。
これはいい方法ですね!
勉強になりました。
こんにちは。先日は有難うございました。
先ほど、このリダイレクトに挑戦していたんですが、メモ帳でテキストをつくり、アップロードしたんですが、FTPにはそのアップロードしたはずのファイルが表示されておらず、(更新しても)でも、その途端、自分のサーバーのすべてのファイルがブラウザで505エラーで見れなくなってしまいました。(MT管理画面も)アップした瞬間だったので、おそらくhtaccessの所為だとは思うんですが、それ自体の実体がFTP上にないんで、どうすればいいのか困っています。で、
heaccessを一度解除?というかそうする方法はありますでしょうか。よろしくお願いします。
追記です。
エラーは505ではなく、500でした。
内容は以下のとおりです。
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there was an error in a CGI script.
If you think this is a server error, please contact the webmaster
すみません、自己解決しました。
お騒がせしました(_ _(--;(_ _(--; ペコペコ
>木津 健さん
こんにちは。
無事に解決されたようで良かったです。
ではでは!
こんにちは。
.htaccessに関する質問です。初めからブログをphp化していれば、.htaccessは不要なファイルなんでしょうか?
簡便な形式のURLでタグアーカイブにアクセスできるようにするには、以下の物を.htaccessに追加する:
RewriteEngine on
RewriteRule ^tag/(.*)$ /mt/mt-xsearch.cgi?blog_id=1&search_key=Tagwire&search=$1 [QSA,L]
と、他のサイトに書いていたので、インデックス・テンプレートをこの部分だけ書いて作ったのですが、どうも自分の場合、.htaccessのファイルが機能していないようです。この場合、どうすればいいでしょうか?
>エースさん
こんにちは。
ご質問はPHP化ではなく、タグアーカイブの件のみという解釈でよろしいでしょうか?
この件に限って言えば、記述した内容が反映されないのであれば、該当記事のすぐ上に書かれている
<MTEntryTags glue=", ">
<a href="<$MTCGIPath$>mt-xsearch.cgi?blog_id=<$MTBlogID$>&search_key=Tagwire&search=<$MTTag encode_url="1"$>">lt;$MTTag$></a>
</MTEntryTags>
を利用すれば .htaccess は不要と思われます。いかがでしょうか?
それではよろしくお願い致します。
いつも参考にさせていただいています。
私のMTのブログをPHP化しました。そして、上記のように、リダイレクトしました。
拡張子がhtml から phpへリダイレクトされるようになったのですが、検索エンジンの自分のブログのインデックス(キャッシュ?)からのリンクが、リンク切れを起こしています。ちなみにphp化した後のhtmlのページはすべて削除済みです。
検索エンジンからのインデックスからのリンクはリダイレクトされないのでしょうか?
改善策があればよろしくお願いします。
忙しいのにすみません。
1..htaccess のフォーマット
RedirectPermanent
でなく、
Redirect Permanent
だと思います。
>aaaさん
こんばんは。
Apacheのディレクティブには次の2種類があります。
- Redirect
- RedirectPermanent
Redirectディレクティブにはpermanentオプション(先頭は小文字)を設定することができ、これがaaaさんの情報のものと思われます。
本文の6項にも記載している通り、動作はいずれも同じという認識ですが誤っているようでしたらご指摘ください。
参考:http://httpd.apache.org/docs/2.3/ja/mod/quickreference.html