今回、他のサイトのドメインを変更することになりました。
旧サイトではドメイン直下で運営していたのですが、それを新サイトのサブディレクトリに移動することになりました。
(旧サイト)http://example.com/
(新サイト)http://example.jp/aaa/
しかも、新サイトでは、それぞれのページのファイル名も変更したため、すべてのページが旧サイトとは異なるURLになります。
もし各ページのURLに変更がないのであれば、.htaccessへの301リダイレクトの記述方法としては、以下の一文で済むかと思います。
Redirect permanent / http://example.jp/aaa/
しかし、今回は各ページのURLの変更を行ったため、各ページごとに新旧のURLの記述が必要です。
ページ単位の301リダイレクトの記述としては、以下のようになるかと思います。
Redirect permanent /aaa.html http://example.jp/aaa/bbb.html
Redirect permanent /ccc.html http://example.jp/aaa/ddd.html
Redirect permanent /eee.html http://example.jp/aaa/fff.html
・
・
・
各ページはこれでいいとしても、トップページでつまずいてしまいました。
ついいつものトップページのURLの記述と同じように、最初下層ページと合わせて以下のように記述しました。
Redirect permanent / http://example.jp/aaa/
Redirect permanent /aaa.html http://example.jp/aaa/bbb.html
Redirect permanent /ccc.html http://example.jp/aaa/ddd.html
Redirect permanent /eee.html http://example.jp/aaa/fff.html
これで一度.htaccessを上書きしテストしてみたところ、トップページのリダイレクトは成功したのですが、下層ページがうまくいきません。
http://example.com/aaa.htmlと入力してもhttp://example.jp/aaa/bbb.htmlには飛ばず、URL入力欄にはhttp://example.jp/aaa/aaa.htmlとドメインは変更になったもののページURLは変更にならず404エラーとなってしまいました。
よく考えてみればそれもそのはず、最初のRedirect permanent / http://example.jp/aaa/の記述は、冒頭にも書きましたように、各ページのURLを変更せずに、単に旧サイトのhttp://example.com/以下のページをそのまますべてリダイレクトする指令なので、この一文が効いているためその下にいくらページごとのリダイレクトの記述をしても効いていなかったのではないかと考えました。
そこで、トップページのリダイレクトに関しては、以下のように訂正しました。
Redirect permanent /index.html http://example.jp/aaa/index.html (indexの拡張子がhtmlの場合)
これで再度試したところ、今度は下層ページもうまくリダイレクトできました。
ここで注意したいのは、このトップページのリダイレクトの記述のままだと、リダイレクト先のURLは、以下のように表示されてしまいます。
http://example.jp/aaa/index.html
飛び先にindex.htmlを指定したので、当然と言えば当然です。
しかしこれではURLの正規化という点では問題が残ってしまいます。
これを解消するためには、以下のように新サイトのルートディレクトリ内の.htaccessにhttp://example.jp/aaa/index.htmlでアクセスした場合にhttp://example.jp/aaa/というように/で終わるようにリライトを行う記述をしておけば解決するかと思います。
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://example.jp/aaa/$1 [R=301,L]
ちなみに、正常に301リダイレクトが行われているかどうかをブラウザで確認する場合、Cookieの関係なのか、なかなか正確に確かめられないケースもあるかと思います。
そうした場合に、以下のツールが役に立ちました。
301以外にも302や404などいろいろなステータスコードがチェックできますので、とても便利です。