【.htaccess】301リダイレクトがどうしても効かない…反映されな過ぎて目が飛び出た話

WordPressでブログを運営するのに、今まで使っていたさくらサーバーからMixhostに引っ越した。ついでに「ブログAの記事をいくつかブログBで使いたい」と思い、記事をいくつか移動させることにした。
記事をコピペして新しいブログで公開し、「さて元ブログから新ブログへと301リダイレクト…あれ?反映されないな?(以下略)」で48時間くらいは.htaccessと戦い続けた。反映されな過ぎて目が飛び出た。
まあどちらかと言うと解決したときにあまりにも簡単なコードで突然301リダイレクトが上手く反映されたからそっちで目が飛び出た。
「どうしても301リダイレクトが反映されない」「.htaccessの変更が反映されてる気がしない」と疲れきったあなたの助けになれば幸いです。
【.htaccess】301リダイレクトがどうしても効かない…

まず今回の問題が起こった僕の環境から。
ドメインA(mofamofa.com)のサブディレクトリ(hogehoge)にWordPressをインストール(mofamofa.com/hogehoge/)。そしてドメインAサブディレクトリのトップ階層に.htaccessを置いた(mofamofa.com/hogehoge/.htaccess)。
.htaccessを削除すると下位ページが全て404エラーになってしまったため、この時点で「.htaccessがちゃんと動いている」ということは分かった。.htaccessが動いているかどうかを確認しておくことは大切。
あと以下は人によって違ってくる部分だけど、僕の場合これが少しややこしかったせいで原因究明が上手くできなかった。
- ドメインAのサブディレクトリに入れたWordPressの記事をドメインB直下に入れたWordPressに移植
- ドメインAの記事パーマリンクに日本語+記号が入っていた→ドメインBでは英語のみにパーマリンクを変更
結論と解決策
結論は、【.htaccessの1行目】に以下のように記述したら解決した。
redirect 301 /hogehoge/日本語〇-blog-01 https://mogamoga.com/english-blog-01
「は?こんなの知ってるし、これも試して反映されないからググってんだろカス!」と思ったかもしれない。
僕だって死ぬほど調べて.htaccessに対する知識レベルが5フィートくらいUPする程度には詳しくなった。その過程でこのコードは試していたし、それでも反映されなかったから遠回りをしてしまった。
ここで大切なのは、「まずはできるだけシンプルな方法で原因を特定すること」だ。まずは以下のことを試してみてほしい。
できるだけシンプルな方法で原因を特定する
.htaccessの一行目に以下のコードを貼ってみる。※当然だけど.htaccessのバックアップは取っておく。
redirect 302 /hogehoge/あまり読まれてない記事.html https://www.google.co.jp
これで「あまり読まれてない記事.html」というパーマリンクの記事にアクセスするとグーグルの検索トップにリダイレクトされる。もちろんリダイレクトされるか確認したらすぐにこのコードを削除して更新しておこう。
これで今「あれ!?リダイレクトされた!!今まで全然動かなかったのに!?なんで!?!?」と喜びが滲み始めている同志もいるのではないだろうか。そう、これさえ動いたことが確認できればあとはURLを変えるだけで上手くリダイレクトされるため、ゴールは目前だ。
原因から遠ざかってしまうこともある
他にもまず.htaccessが動いているかを確認するためのコードとして、色んなサイトで紹介されているのがこちら。
ErrorDocument 404 http://www.google.com/
僕の場合、ちゃんと.htaccessの1行目にこれを記述したのに全く効かなかった。存在しないページにアクセスすると「お探しの記事はありません。」と出る。このせいで「あれ?もしかして.htaccessが動いていないのかな?」と遠回りすることになった。
こんな感じで「コードの記述方法が間違っているのではないか」という頭で調べていたせいで、原因を上手く特定することができず遠回りをしてしまった。だから今回のことで「何よりもまずは原因を究明するのが大事」だということを改めて実感した。
.htacccess「redirect 301」の書き方と注意点

コードの書き方で注意しないといけないことがいくつかあって、少し違うだけで上手くリダイレクトされなかったりする。
だけどもうリダイレクトがちゃんと効くことは分かったのだから、URLを正しく記述することで確実にリダイレクトさせることができるので落ち着いてゴールまで走り切ろう。
半角スペースで区切る
まずは半角スペースの位置。見れば分かるけど間違ってしまいやすい部分かもしれない。
redirect[スペース]301[スペース]リダイレクト元の相対パス[スペース]リダイレクト先の絶対パス
という形になるように。
リダイレクト元のスラッシュに注意
スラッシュの位置に注意が必要な場合も。
redirect 301 /hogehoge/日本語〇-blog-01 https://mogamoga.com/english-blog-01
前者リダイレクト元のURLの先頭にはスラッシュがあり、末尾にはスラッシュがない。
後者リダイレクト先は絶対パスなので問題ないはず。リダイレクト先URL末尾のスラッシュはあってもなくてもどっちでもOK。
つまり「リダイレクト元」の相対パスで指定している部分のスラッシュが重要で、この末尾にスラッシュを付けてしまうことで正確にリダイレクトされなくなってしまうことも。つけていても問題なく正常にリダイレクトされることもある。
日本語ドメインと日本語パーマリンクの301リダイレクト
日本語ドメインと日本語パーマリンクがまたややこしい。
まずリダイレクト元の記事に日本語や記号をパーマリンクとして使用している場合、これはエンコードせずにそのまま記述しなければいけない。.htaccessみたいなファイルに日本語とか記号書いていいの!?って感じだけど、エンコードしちゃうと逆にダメだったりする。
逆にリダイレクト先に日本語ドメインや日本語パーマリンクを使用している場合、こちらは全てエンコードしておかなければいけない。これもややこしくて「ちゃんとリダイレクトされないのはエンコードが原因?」なんて考えてしまって遠回りした。
複数記事をリダイレクトさせる際の記述方法
複数記事をリダイレクトさせる際の.htaccess記述方法は、以下のようにシンプルに書いていくだけ。
redirect 301 /hogehoge/blog-01 https://mogamoga.com/blog-a redirect 301 /hogehoge/blog-02 https://mogamoga.com/blog-b redirect 301 /hogehoge/blog-03 https://mogamoga.com/blog-c
ちなみにこのリダイレクトコードの先頭に記述する「redirect 301 」は。「redirect permanent」と書いてもいいみたい。どっちも同じ意味。
リダイレクトチェックツールに注意!

あとリダイレクトチェックツールも信用し過ぎて痛い目を見た。
ブラウザだとキャッシュで上手くリダイレクトされているか確認できないため、リダイレクトチェックツールを使う方がいいと色んなブログで紹介されていた。
それでずっと使っていたのがリダイレクトチェック|SEOツール【ohotuku.jp】。
これで「リダイレクトされてません」みたいに言うから信じてたのに、リダイレクトに成功した状態でチェックしてみると同じように「リダイレクト回数ゼロ、できてません」みたいにおっしゃる。
一方、こちらのサイトリダイレクト検証ツール | SEO 検索エンジン最適化でチェックしてみると、「https://がBadだから上手く検証できないよ」みたいなことを返してくれた。これで気づけた。ありがとう。
つまり原因は、リダイレクトするかどうか確認するために入力したURLのプロトコルを「https://」で入れてしまっていたため結果が反映されなかったようだ。「http://」でリダイレクトチェックしたら「リダイレクト回数1回」のようにちゃんと表示された。
リダイレクトチェックツールを信じ過ぎると遠回りをするかもしれないので、まずは自分でグーグル検索にリダイレクトするのを目視で確認するのが確実だと思う。
サーバーがMixhostのせい?専用キャッシュプラグイン「LiteSpeed Cache」のせい?
MixhostのサーバーはApacheの上位互換と言われているLiteSpeedだけど、「mod_rewriteはApacheでしか使えないよ」みたいな記事をたくさん見たせいで「リダイレクトできないのはサーバーのせいかもしれない」みたいに疑って調べ始めて、どんどん原因から遠ざかって行った。あぱっち。
それと僕はMixhostに引っ越してから、有効化するだけで高速化してくれる素敵プラグイン「LiteSpeed Cache」を使っている。爆速になって気に入っている。
もちろんリダイレクトの確認をするときはキャッシュプラグインは停止しておいたほうがいいのかもしれない。だけど今回はMixhostもキャッシュプラグインも全然悪くなかった。疑ってごめんね。
Mixhost本当に素晴らしいサーバーです。
あとがき

この記事を読んでいる人はきっと「検索して分かることは試しきってそれでもリダイレクトされなかった」という状況のはず。
リダイレクトについてもっと詳しい記事はたくさんある。僕もそれらを全て読んで、結局「RewriteEngine On」といった記述さえ必要なかったことに腰を抜かした。
無駄にサーバーの知識とか「mod_rewrite」「RewriteRule」について詳しく勉強してしまった。使うことなさそうなのに。
そのうち何故か.htaccessを一から書く方法を勉強し始めてRewriteCondについて調べ始めてとき、最初の方法でなんとなくあまり読まれていない記事をリダイレクトさせてみたらなんとサクっとリダイレクトされた。初めてグーグルのページに移ったときは歓喜した。
徹夜で試行錯誤してあまりにリダイレクトが反映されないから「これはサーバーに原因があるんじゃないか」と思ってMixhostのサポートに問い合わせたら「.htaccessの記述に関してはサポート外です」と一蹴され、
サーバーをMixhostに引越して、さらにあるブログ記事を別のブログに引越しさせるために301リダイレクトさせようとしたら上手くいかない。6時間かけて調べて色々試し尽くしてもまだ動かない。そのせいで無駄に.htaccessの理解が深まった。今夜も頑張ろう…
— sakura@FX初心者 (@sakura_box1) 2018年7月30日
とツイートしてから2日目も頑張って色々と試していたらついに…!!
その勢いでこの記事を書いている。ふぅ。
もし同じ境遇で.htaccessと戦い続けてこの記事にたどり着き、問題を解決して目が飛び出た同志がいれば涙を分かち合いたいので是非コメントで教えてね。本当にお疲れさまでした。






