.htaccess によるリダイレクト

.htaccess によるリダイレクト

Posted at October 31,2005 11:55 PM
Tag:[htaccess, MovableType, PHP, Redirect]

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ステータスコードになりますのでご注意ください。

参考サイトは下記です。ありがとうございました。

関連記事
トラックバックURL


トラックバック

各種パスと Movable Type のテンプレートタグ from hxxk.jp
ユーザマニュアルに MTBlogRelativeURL というテンプレートタグが記載されています。これを使えばドキュメントルートからの相対パスの記述を MT テ... [続きを読む]

Tracked on November 1, 2005 10:22 PM

MovableTypeのPHP化 from フォトショップを使い「こなす」ブログ
興味はあったものの、ややこしそうだったので後回しにしていたMovableType... [続きを読む]

Tracked on March 22, 2006 2:33 AM

アーカイブのPHP化と「.htaccess」 from Project MultiBurst
以前から考えていましたが、なかなか理解できていなかったのと、 暇がなかったのもあってやれなかったことがあります。 それは、 『アーカイブのPHP化とページ... [続きを読む]

Tracked on May 24, 2006 10:56 PM

Movable Type カスタマイズ一覧 from Eternal World
当サイトはMovable Typeを利用していますが、 快適な運用を行うために、... [続きを読む]

Tracked on August 22, 2006 2:12 AM

Movable Typeの携帯対応化について考えてみる from Free Style IIDX
基本htmlな構成だが、TOPだけはphpで、携帯端末からのアクセスした場合、 ... [続きを読む]

Tracked on September 8, 2006 3:12 AM

MTをphp化しました。 from RedLine Magazine
昨日のエントリで「やっぱりphpにしとけばよかった」と、ぶつぶつ言ってみたので只... [続きを読む]

Tracked on September 18, 2006 9:41 PM

リダイレクト(まとめ) from SEO アクセスアップ ウェブのしあわせ
PHPで301リダイレクトを行う方法 ⇒サイト移転時の301リダイレクト処理の具体例:phpspot開発日誌 [続きを読む]

Tracked on January 9, 2007 11:54 AM

MT FC2ブログ : 記事の移行の注意点(インポート エキスポート) from kubolog - クボログ:久保のブログ -
「kubolog - クボログ:久保のブログ - 」は、 2007 3/25にF... [続きを読む]

Tracked on March 31, 2007 5:08 PM

MT FC2ブログ : 記事の移行の注意点(インポート/エキスポート) from kubolog - クボログ:久保のブログ -
「kubolog - クボログ:久保のブログ - 」は、 2007 3/25にF... [続きを読む]

Tracked on March 31, 2007 5:21 PM

ダイナミックパブリッシング化&PHP化 from ムジログ
Movable Typeにしてから最も不満だったのが、再構築の時間が長いという... [続きを読む]

Tracked on March 16, 2008 3:44 PM

htaccessでリダイレクション from web daily life
ブログのphp化をする際に、それぞれの個別記事やアーカイブなどのアドレスが変わっ... [続きを読む]

Tracked on May 4, 2008 8:03 PM

【htaccess】ブログの引越しです。【リダイレクト】 from ガラクタ知識
ブログの引越しでhtaccessを使って既存の記事から引越し先にリダイレクトさせました。(←日本語でおk) [続きを読む]

Tracked on June 14, 2008 12:08 PM

.htaccess で移転先URLページへ誘導する:MT4.1 from Atelier
 MT4.1 で「小粋空間」さんのテンプレート・セットに移行したときに、ブログ名... [続きを読む]

Tracked on July 5, 2008 5:04 PM

ドメイン移行時に旧サイトへのアクセスを新ドメインへ転送する方法。(.htaccessを利用したリダイレクト設定) from PC Portal
 サブドメインで運営していたサイトを新規ドメインを取得して移行しました。 この移行時に問題となったのが、新ドメインに移行すると旧ドメインで貼られているリン... [続きを読む]

Tracked on February 1, 2010 12:38 AM

今日のブログいじり from M's_Bar
・当ブログのhtml→php化 参考:Movable Type 4 の... [続きを読む]

Tracked on February 16, 2013 4:52 AM
コメント

うぃー。ご無沙汰ですー。
これって、ぐぐる先生に嫌われるとか嫌われないとか。どんなもんなんでしょうねぇ。
私はgoogleからの訪問が激減りしてたので、このリダイレクトを最近やめてみましたが、その結果どうなるかはまだ結果わかりましぇん。

[1] Posted by Border. : November 2, 2005 1:58 AM

>Border.さん
こんにちは。
ごぶさたです。(笑)

リダイレクトどうなんでしょう。
私の旧サイトからのリダイレクトはPageRankには影響なかったようです(検索結果の方は不明)。

最初からドメインとファイル名を確定させるのが一番大事かもしれませんね(これが難しいのですが)。

[2] Posted by yujiro : November 2, 2005 12:40 PM

こんにちは、毎回参考にさせてもらってます。

個別エントリー(エントリー番号を使った場合)と月別・日別エントリーに関しては 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をサブカテゴリ対応に変えた場合は対応しようがありませんが、そうでなければカテゴリアーカイブでも使えそうですね。

[3] Posted by やすひさ : December 11, 2005 11:28 AM

>やすひささん
こんにちは。
アドバイスありがとうございます。
これはいい方法ですね!
勉強になりました。

[4] Posted by yujiro : December 11, 2005 1:54 PM

こんにちは。先日は有難うございました。
先ほど、このリダイレクトに挑戦していたんですが、メモ帳でテキストをつくり、アップロードしたんですが、FTPにはそのアップロードしたはずのファイルが表示されておらず、(更新しても)でも、その途端、自分のサーバーのすべてのファイルがブラウザで505エラーで見れなくなってしまいました。(MT管理画面も)アップした瞬間だったので、おそらくhtaccessの所為だとは思うんですが、それ自体の実体がFTP上にないんで、どうすればいいのか困っています。で、
heaccessを一度解除?というかそうする方法はありますでしょうか。よろしくお願いします。

[5] Posted by 木津 健 : January 15, 2006 5:54 PM

追記です。
エラーは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

[6] Posted by 木津 健 : January 15, 2006 5:59 PM

すみません、自己解決しました。
お騒がせしました(_ _(--;(_ _(--; ペコペコ

[7] Posted by 木津 健 : January 15, 2006 9:12 PM

>木津 健さん
こんにちは。
無事に解決されたようで良かったです。
ではでは!

[8] Posted by yujiro : January 16, 2006 12:43 PM

こんにちは。

.htaccessに関する質問です。初めからブログをphp化していれば、.htaccessは不要なファイルなんでしょうか?

簡便な形式のURLでタグアーカイブにアクセスできるようにするには、以下の物を.htaccessに追加する:

RewriteEngine on
RewriteRule ^tag/(.*)$ /mt/mt-xsearch.cgi?blog_id=1&search_key=Tagwire&search=$1 [QSA,L]

と、他のサイトに書いていたので、インデックス・テンプレートをこの部分だけ書いて作ったのですが、どうも自分の場合、.htaccessのファイルが機能していないようです。この場合、どうすればいいでしょうか?

[9] Posted by エース : June 24, 2007 5:04 PM

>エースさん
こんにちは。
ご質問は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 は不要と思われます。いかがでしょうか?
それではよろしくお願い致します。

[10] Posted by yujiro : June 25, 2007 2:53 PM

いつも参考にさせていただいています。
私のMTのブログをPHP化しました。そして、上記のように、リダイレクトしました。
拡張子がhtml  から phpへリダイレクトされるようになったのですが、検索エンジンの自分のブログのインデックス(キャッシュ?)からのリンクが、リンク切れを起こしています。ちなみにphp化した後のhtmlのページはすべて削除済みです。

検索エンジンからのインデックスからのリンクはリダイレクトされないのでしょうか?

改善策があればよろしくお願いします。
忙しいのにすみません。

[11] Posted by kame : May 5, 2009 8:52 AM

1..htaccess のフォーマット

RedirectPermanent
でなく、
Redirect Permanent
だと思います。

[12] Posted by aaa : October 21, 2011 7:04 AM

>aaaさん
こんばんは。
Apacheのディレクティブには次の2種類があります。

  • Redirect
  • RedirectPermanent

Redirectディレクティブにはpermanentオプション(先頭は小文字)を設定することができ、これがaaaさんの情報のものと思われます。

本文の6項にも記載している通り、動作はいずれも同じという認識ですが誤っているようでしたらご指摘ください。

参考:http://httpd.apache.org/docs/2.3/ja/mod/quickreference.html

[13] Posted by yujiro logo : October 22, 2011 2:45 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)