.htaccess での301リダイレクトの設定方法を教えてください。


サイトのルートディレクトリーに、全てのページが入ってしまっているサイトがあります。
ページ数は約1000ページです。

これら1000ページのファイルを、ルートディレクトリー以下にカテゴリー別のディレクトリーを作成して、整理したいのですが、複数のカテゴリーに分けるのと、ページ数が多いので、リダイレクトに関する記述をどのようにすべきか教えていただけると助かります。

例:間に一つだけディレクトリーを追加する
引っ越し前 http://www.example.com/001.html
引っ越し後 http://www.example.com/category/001.html

例:間に2つディレクトリーを追加しなければならいページもあります。
引っ越し前 http://www.example.com/001.html
引っ越し後 http://www.example.com/category/sub-category/001.html

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/04/16 14:10:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント50pt
RewriteEngine on
RewriteRule ^/?([0-9]+.html) /category/$1 [R=301,L]

↑こんな感じでこの後ろにRewriteRuleを列挙していけばよいでしょう。
ただ、質問にある例だとやりたい事がよくわからないので真面目に具体例を書いたほうが良いです。/001.html をどっちにリダイレクトすればよいかすら不明ですので。

id:taroe No.2

回答回数1099ベストアンサー獲得回数132

ポイント50pt

Redirect permanent /001.html http://www.example.com/category/sub-category/001.html


1つずつ上記のようにかけばどうでしょうか?
これで301リダイレクトになります。

1000ページなので、1000個ですが、その程度なら問題ないはずですよ。

  • id:rouge_2008
    リダイレクト元のファイル名にも規則性がないと、まとめて記述する事はできませんので、回答にあるようにファイルの数だけ列挙することになります。

    aa-001.html、aa-002.html、aa-003.html ... のように「aa-」で始まるファイルを「category/ファイル名」にリダイレクトし、
    bb-001.html、b-002.html、bb-003.html ... のように「bb-」で始まるファイルを「category/sub-category/ファイル名」にリダイレクトさせるという場合は、ある程度まとめて記述する事ができます。

    ※001~200.htmlまでは「category/ファイル名」にリダイレクトし、201~500.htmlまでは「category/sub-category/ファイル名」にリダイレクトさせるという場合もまとめて記述できます。
    もしリダイレクト元のファイル名に規則性があるのでしたら、リダイレクト元とリダイレクト先の規則性が分かるように教えてください。
  • id:nobu55
    回答とコメント ありがとうございます。

    リダイレクト元のファイル名は、全く規則性がなく、半角数字も利用していません。


    リンク元:http://www.exapmle.com/tarou.hmtl
    リンク先:http://www.example.com/category1/tarou.html

    リンク元:http://www.example.com/hanako.html
    リンク先:http://www.example.com/category2/hanako.html

    リンク元:http://www.example.com/jirou.html
    リンク先:http://www.example.com/category3/subcategory1/jirou.html

    リンク元のURLは、全く規則性がなく、それぞれ異なった単語になっています。

    リンク元のURLに全く規則性がない場合は、どのように記載すればよいのでしょうか?
  • id:y-kawaz
    全く規則性がないのであれば以下のようにひたすら列挙していくしかありません。
    >|
    RewriteEngine on
    RewriteRule ^/tarou.hmtl /category1/tarou.html [R=301,L]
    RewriteRule ^/hanako.html /category2/hanako.html [R=301,L]
    RewriteRule ^/jirou.html /category3/subcategory1/jirou.html [R=301,L]
    |<

    これが数千あるのであればアクセス事に読み込まれる .htaccess ではなく、httpd.conf の方に書いたほうが良いでしょう。
    ちなみに ^/tarou.html の部分は .htaccess に書くなら / は不要で、^tarou.html になります。
  • id:rouge_2008
    y-kawazさんのコメントの通りです。
    大変だとは思いますが、一つずつ記述するしかありません。
    次のようにファイル名を「|」で区切って複数指定する事もできますので、行数を少しですが少なくする事ができると思います。
    リダイレクト元のファイル名の部分を半角括弧()で囲むと、$1にファイル名が入りますので、リダイレクト先のファイル名を個別に記述する必要はありません。

    RewriteEngine on
    RewriteRule ^/(tarou|support|contact|map)\.html /category1/$1.html [R=301,L]
    RewriteRule ^/(jirou|service1|xxx)\.html /category3/subcategory1/$1.html [R=301,L]
  • id:rouge_2008
    リダイレクト先は何種類ありますか?
    次の方法の方が、すべて手作業で行うよりは楽になるかもしれません。

    1.作業用にフォルダごとコピーを作成します。

    2.作成したコピーをリダイレクト先ごとにフォルダにまとめます。
    ※aaa.html、bbb.html、ccc.html ... を「cat1」に、ddd.html、eee.html、fff.html ... を「cat2」にという感じで。(この時のフォルダ名はリダイレクト先と違っても大丈夫ですが、略した名前にして置くと後で作業がし易いかもしれません。)

    3.コマンドプロンプトを起動します。

    4.手順2でまとめたフォルダに移動します。
    ※Cドライブのwork_dirにcat1を作成してまとめた場合、次のように入力してエンターキーを押すと、作業ディレクトリcat1に移動します。

    cd c:\work_dir\cat1

    5.次のコマンドを入力後、エンターキーを押して実行します。
    (実行すると、file_list.txtを作成して、cat1フォルダ内のファイル一覧を出力します。)

    dir /b/s > file_list.txt

    http://www.atmarkit.co.jp/fwin2k/win2ktips/505flists/flists.html

    6.作成されたfile_list.txtを、正規表現による検索・置換が可能なテキストエディタで開きます。
    ※テキストエディタでなくても、正規表現による検索・置換が可能でしたら大丈夫ですが、ソフトによって若干動作が異なる場合があります。
    私はサクラエディタ(フリーソフト)を使用しましたので、上手くいかない場合は同じソフトを使用してみてください。
    http://sakura-editor.sourceforge.net/download.html
    ※要正規表現DLL(bron205.zipのbregonig.dllを使用します。解凍後、サクラエディタと同じフォルダに入れてください。
    ただし、パッケージに含まれている場合は必要ありません。)
    http://homepage3.nifty.com/k-takata/mysoft/bregonig.html

    7.ファイル名だけ残ればいいので、最初の行のファイルのパスで、ドライブからファイル名の前の\までを選択した状態で、ツールバーの「置換」ボタンまたはメニューの「検索」→「置換」を実行します。

    8.置換前に選択部分が入っている事を確認(置換後は空欄のまま)したら、「正規表現」にはチェックを入れないで、「すべて置換」を実行します。

    9.ファイル名だけになったら、カーソルをファイルの先頭に移動し、再度「置換」ボタンを実行します。

    10.置換前と置換後にそれぞれ次のように入力し、正規表現にチェックを入れてから、「すべて置換」を実行します。
    ※「置換」で1~2個正常に置換が完了してから、「すべて置換」を実行した方がいいかもしれません。
    ※正常な動作は、置換を実行すると、1行ずつ改行が取り除かれて、ファイル名の後ろに|がつきます。

    「置換前」 ([A-za-z_0-9.-]+)\r\n
    「置換後」$1|

    11.ファイルの先頭にカレットと半角の開始括弧「^(」を入力し、ファイルの末尾の「|」を削除後、半角の閉じ括弧とドル記号「)$」を入力します。1行で「^(ファイル名|ファイル名2|ファイル名3...|ファイル名??)$」のようになるようにします。
    ※このファイルの記述を後でリダイレクト元に使用します。

    ※手順4~11まで、まとめたフォルダの数だけ繰り返します。
    ※完了したら、.htaccessまたはhttpd.confに設定を追加していきます。(記述はコメントにあるような形式になりますが、ファイル名に拡張子も含まれているので、括弧より後ろの拡張子は必要ありません。リダイレクト先も「/XXXXX/$1」のように拡張子をつけずに記述します。)
    ※1行の有効な文字数が分かりませんので、あまりにファイル数が多すぎると、正常に動作しないかもしれません。(1行に約280個のファイル名を記述した場合の正常動作を確認しましたが、各ファイル名の長さによっては正常に動作しないかもしれません。)
  • id:nobu55
    rouge_2008さん、 y-kawazさん、回答とコメントありがとうございます。
    rouge_2008さんには、色々なオプションを教えていただいて恐縮です。

    最後にご案内いただいた、コマンドプロンプトを利用した方法は、少し敷居が高そうなので、テキストエディターの置き換え機能等を利用して、一つづつ書き足してゆこうと思います。

    .htaccess のファイルサイズが大きくならないかが心配です。
    y-kawaz さんに教えていただいた、httpd.confについては、ちょとt難しそうなので、まずは一つづつ書いてゆこうと思います。
  • id:nobu55
    rouge_2008さん、 y-kawazさん、回答とコメントありがとうございます。
    rouge_2008さんには、色々なオプションを教えていただいて恐縮です。

    最後にご案内いただいた、コマンドプロンプトを利用した方法は、少し敷居が高そうなので、テキストエディターの置き換え機能等を利用して、一つづつ書き足してゆこうと思います。

    .htaccess のファイルサイズが大きくならないかが心配です。
    y-kawaz さんに教えていただいた、httpd.confについては、ちょとt難しそうなので、まずは一つづつ書いてゆこうと思います。
  • id:rouge_2008
    > 最後にご案内いただいた、コマンドプロンプトを利用した方法は、少し敷居が高そうなので、テキストエディターの置き換え機能等を利用して、一つづつ書き足してゆこうと思います。

    慣れていないと難しく感じるかもしれませんね。
    1回試してみれば、それほど難しくないと思うかもしれませんが・・・
    ファイル数がそれほど多くないフォルダで試してみてはいかがでしょうか?
    dirはファイルの一覧を出力するだけで、何も変更しないので安心して実行して大丈夫です。
    /bはファイルの更新日時、サイズ等の情報を表示せず、ファイル名だけ表示するオプションです。
    /sはサブフォルダ以下のファイルやフォルダも対象するオプションです。
    コマンドとオプションに続けて「 > ファイル名」を入力すると、指定したファイルに結果を出力します。
    ファイルの一覧を自動で出力して、それを.htaccessにコピーして使用すれば、1個ずつ書くよりは結構時間短縮になると思います。


    .htaccessのファイルサイズは多少大きくなると思いますが、今回のようにリダイレクト元とリダイレクト先に規則性がない場合は仕方がありません。
    数ヶ月経つ頃には過去のページにアクセスする人もいなくなると思いますので、その時に削除するようにすればいいと思います。
    ファイル数が多くて大変だと思いますが頑張ってください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません