WordPressのリダイレクトの設定方法【サンプルコードあり】

WordPressのリダイレクトの設定方法は?
プラグインRedirectionsで正規表現で一括指定するコードのサンプルは?
マルチサイト化した上で、htaccessでリダイレクトさせるのって難しい?
こんな疑問に答えます。

htaccessの編集でリダイレクトさせようとしたのですが…難しかったです。
なので、プラグインRedirectionsを使用して解説しています。

違う目的でリダイレクトでさせたい方も、共通している部分は多いと思いますので、ぜひ参考にしてください。

僕はWordPressのブログでは月2万PV、自作のiPhoneアプリを2つリリースしています。
そんな僕が解説していきます。

作業環境

MacOSX High Sierra
WordPress 4.9.8 でマルチサイト機能で多言語サイトを運営(別サイト)
テーマ WING-AFFINGER5
(qtranslateXで多言語化したサイトをプラグイン停止してリダイレクトさせる)

1.リダイレクトの基礎知識

(1)リダイレクトとは

ブログをリダイレクトさせる…簡単にいうと、WebブラウザでURLを開こうとした時に別のURLを開かせる技術のことです。

URLリダイレクトとは、複数のURLアドレスでWebページを利用できるようにするWorld Wide Web技術です。
URL転送とも呼ばれます。
WebブラウザでリダイレクトされたURLを開こうとすると、別のURLでページが開かれます。
https://en.wikipedia.org/wiki/URL_redirectionより翻訳引用

(2)主にブログで使うのは301のリダイレクト

リダイレクトにも種類がありますが、今回使うのは301のリダイレクトです。
なぜなら、Goggle神が、それを使えと言っているからです。

この記事でも、301リダイレクトのことを話していきます。

検索エンジンの結果で表示されるページの URL を変更する必要がある場合は、サーバー サイドの 301 リダイレクトを使用することをおすすめします。
これは、ユーザーや検索エンジンが正しいページにたどり着くことを保証する最善の方法です。
ステータス コード 301 は、ページが別の場所に完全に移転したことを意味します。
ページの URL の変更と 301 リダイレクトの使用
https://support.google.com/webmasters/answer/93633より引用

リダイレクトの種類
HTTP / 1.1では、リダイレクト用のいくつかのステータスコード(RFC 7231)が定義されています。

HTTPステータスコード HTTPバージョン 一時的/恒久的 キャッシュ可能な 依頼メソッド後続依頼
301 HTTP / 1.0 恒久的 可能 GET / POSTが変更できる

https://audisto.com/insights/guides/31/ via https://en.wikipedia.org/wiki/URL_redirection#HTTP_status_codes_3xxより引用

2.リダイレクトさせたい理由

リダイレクトさせたい理由は、いくつかのパターンに別れると思います。

  1. サイトを移転してURLを変更した時
  2. wwwが付いたURLでアクセスされた時に、ないURLに飛ばす
  3. httpでアクセスしてきた人を、httpsへ飛ばす
  4. サイトをマルチサイト化して、URL構造が変わったため、新しいURLへ飛ばす
  5. 2つのサイトを融合した時

今回、僕は4番です。

僕は自分のブログを「マルチサイト化」「多言語化」しています。
その過程で、リダイレクトさせたいので挑戦しました。

3.リダイレクトさせる方法を選ぶ

リダイレクトさせる方法は、いくつかあるようです。

・htaccessを自分で編集する
・プラグインRedirectionsを使う
・他のマイナープラグインを使う
・htacess以外のコードで命令する

4.htaccessを自分で編集する

htaccessを自分で編集してリダイレクトさせるのが一番良さそうです。

www取るとか、https対応なら簡単に書けるんですけどね。
情報も多いし。

今回は僕はマルチサイトをリダイレクトさせるので、まず例文を探していきます。

(1)htaccessの例文をGoogle公式ガイドで探す

Google公式では、以下のページを見てhtaccessは自分で書け、と言っています。
どっちのリンクもあまり親切に解説していないんですよね。
WordPressの公式ページの説明や例文もイマイチ、理解しにくいと思います。

詳しくは、Apache .htaccess チュートリアルApache URL Rewriting Guide(英語)をご覧ください。
https://support.google.com/webmasters/answer/93633より引用

(2)htaccessの例文を幅広く探す

次に、一般ブログの方を日本語英語で見ていきました。

こちらの2サイトはhtaccessの例文と理論を丁寧に解説していて参考になりました。
ここで、自分の状況と一致するhtaccessの例文があれば、それを参照するといいと思います。

WordPressでURLを別のURLにリダイレクト(自動転送)する方法
https://lab.maro-log.net/post-3873/

.htaccess でのリダイレクト(転送)設定の書き方
http://www-creators.com/archives/248

しかし、僕の場合は、この中に一致するのはなかったんですね。

(3)htaccessジェネレーターなるものを試す

「htaccess generater」で英語で探すと、たくさん出てきますね。
リダイレクトさせたいURLを入れていけば、htaccessの文章を生成してくれるサービスです。
大抵、広告ばっかり貼ってある系のサービスです
(リンク貼りません)

でもこれ…AというページをBにリダイレクトさせる文しか作れないんですよ

僕はA2もA3もA4も、B2B3B4に飛ばしたいので、目的と違いました。
(正規表現ってやつ)
しかも、生成コードの中にも広告文章が入ってるんだわwwww

(4)自分で理論から考えてhtaccsessを書く

例文が見つからなかったので、仕方なく、自分で書こうと思い挑戦しました。
(結局、日本語と英語で1時間くらい探しましたが、いい例文が見つかりませんでした。)

以下は、僕が必要な特殊なhtaccsessを自分で作成に挑戦した記録です。
結局、失敗しているので、必要のない方は次の章まで読み飛ばしてください。

A.現状の僕のhtaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
</IfModule>
# END WordPress

マルチサイト化しています。
現状で何が行われているか、自分で7割くらい(恥)理解しています。

B.僕がhtaccessで実現させたいこと

僕がリダイレクトさせたい内容は次の2点。

(1)翻訳プラグイン「qtrasrateX」で作成してしまったURLを、新しくマルチサイト化したブログにリダイレクトさせる。
つまり、「^?p=597&lang=en」へのアクセスを「^en/post-597」に変換する

(2)URL構造「?p=597」というものを「post-597」に変換する

どうやら、2番目に関しては、すでに上の記述で解決しているようです。
なので、1番目について、自分で書いていきます。

(現在の記号なしURL)
https://xxxxxxxxxxxxx.com/?p=597
→https://xxxxxxxxxxxxx.com/post-597/

(現在の日本語ページURL)
https://xxxxxxxxxxxxx.com/?p=597&lang=ja
→https://xxxxxxxxxxxxx.com/post-597/

(現在の英語ページURL)
https://xxxxxxxxxxxxx.com/?p=597&lang=en
→https://xxxxxxxxxxxxx.com/en/post-597/

C.htaccess書くときのポイント

・(.*)の使い方

http://blog.livedoor.jp/blogfire-it_skill/archives/46040725.html
この場合、ここに(.*)が代入される。つまり、文字なしを含む、あらゆる文字列。
例えば、「hoge.html」「sample」「文字なし」など、何でも。

・$1、$2の使い方

https://www.rubylife.jp/regexp/backreference/index4.html
上記の場合、変数「$1」には「s_」にマッチする部分文字列、変数「$2」には「.+」にマッチする部分文字列、変数「$3」には「_e」にマッチする部分文字列が代入されます。

D.結論(失敗)

RewriteRule ^?p=([0-9A-Za-z]+)&lang=en$ ^/en/post-$1/ [L]

こうじゃね?

上手くいかない…

・すでにpの部分は記述済みっぽいよね?postを移転すればいいのかな?
・すでに記述してある文章の意味がわかってないとダメ
・優先順位があるのかなあ
・?記号は使っちゃダメなのかな

すいません、上手くいかないです。
制限時間が過ぎてしまったので、あきらまめす。
人生有限だしね、実力不足

プラグイン使います…
(仕方ない)

5.プラグイン「Redirections」を使う

htaccessの編集に失敗したので、素直にプラグインを使っていきます。

リダイレクトのプラグインは、SEO的にもダントツで「Redirections」の評判が良かったです。

Redirections
https://wordpress.org/plugins/redirection/

5−1.Redirectionsのインストール、有効化

インストールなんですが、マルチサイトを使用している方は注意です。
個々のページのプラグイン画面からではインストールできません。
参加サイト>サイトネットワーク管理>プラグインからインストールします。

通常営業の方は、普通にインストールするだけです。

5−2.Redirectionsの設定の基本

Redirectsタブを開きます。

「新しい転送ルールを追加」の部分から、ルールを書き加えていきます。

5−3.1つ試しにリダイレクトさせてみる

まず、1つ試しに、わかりやすいリダイレクトを試してみます。
具体的な、597番目の記事に絞ってリダイレクトを試します。

(現在の英語ページURL)
https://xxxxxxxxxxxxx.com/?p=597&lang=en
→https://xxxxxxxxxxxxx.com/en/post-597/

これを実現したいです。

ソースURL「/?p=597&lang=en」 → ターゲットURL「/en/post-597/」

と書きましが、上手くいきません。
何がおかしいのか、よく考えました。

どうやら、プラグインを使わなくても、「/?p=597」は「/post-597」にリダイレクトされているようです。

5−4.2段階リダイレクトさせたら、上手くいった

2段階でリダイレクトしたら上手くいきました。

ソースURL「/?p=597&lang=en」 → ターゲットURL「/en/post-597/」
ソースURL「/post-597/&lang=en」 → ターゲットURL「/en/post-597/」

これを、597だけでなく、全URLで共通するような表現にしていきます。
もっとちゃんと書きますね。

6.正規表現でコードを書く

正規表現とは、ようするに「全員一気に命令」ができるように書く表現ってことですね。
さっきは597番目の記事だけに対してコードを書きましたが、全員に当てはまるように書き換えていきます。

正規表現とは、文字列の集合を一つの文字列で表現する方法の一つである。
https://ja.wikipedia.org/wiki/正規表現

正規表現の書き方については、こちらのサイトがわかりやすかったです。
僕はhtaccessで悪戦苦闘している間に、自然と覚えました。

【mod_rewrite】正規表現
http://ysklog.net/mod-rewrite/regular-expression.html

サンプルとして、僕が成功したコードを載せておきます。
先ほどの実験と同様に、2段階で行なっています。

(1)サンプルコード1段階目

ソースURL(転送元)

p=数字の形で、かつ「qtrasrateX」で生成された英語ページ全般をすべて指定しています。

/?p=(.*)&lang=en

ターゲットURL(転送先)

これを全部、「en」と名付けたEnglishページ(マルチサイト)に転送します。

/en/post-$1/

その他

「正規表現」の部分に、忘れずにチェックを入れます。

(2)サンプルコード2段階目

ソースURL(転送元)

post-数字の形で、かつ「?lang=en」が付いてしまったページを指定しています。
おそらく「?p=」「post」の変換が優先されて行われている(?)ので、2段階目で、こちらも指定する必要があると思われます。

/post-(.*)/?lang=en

ターゲットURL(転送先)

これを全部、「en」と名付けたEnglishページ(マルチサイト)に転送します。

https://xxxxxxxxxxxxx.com/en/post-$1/

ここはhttpsから書きます。

その他

「正規表現」の部分に、忘れずにチェックを入れます。

(追記)
3段階目が必要です
すいません、これだと、どうしても
https://xxxxxxxxxxxx.com/?/en/post-yyyy/
のような形に飛んでしまいますね。

うーん、なんでだろ

とりあえず、三番目のルールとしてこのように追記すると、飛ぶようになります。

/?/en/post-(.*)/

https://xxxxxxxxxx.com/en/post-$1/

もっとスマートに書けた方がいいですよね。
うーん、なんでだろ。

これでも失敗する場合があります
ブラウザのキャッシュなどを削除して、真っさらな状態でチェックする必要があります

?の書き方が正規表現になっていないからかもしれないです。

個別でリダイレクト設定していけば、とりあえず、リダイレクトは成功しました。

7.動作をチェック

2つのコードを入れた後、動作をチェックしていきましょう。

ちゃんと移動するか?

(記号なしURL)
https://xxxxxxxxxxxxx.com/?p=597 → https://xxxxxxxxxxxxx.com/post-597/

(現在の日本語ページURL)
https://xxxxxxxxxxxxx.com/?p=597&lang=ja → https://xxxxxxxxxxxxx.com/post-597/

(現在の英語ページURL)
https://xxxxxxxxxxxxx.com/?p=597&lang=en → https://xxxxxxxxxxxxx.com/en/post-597/

すべて、ちゃんと移動しました。

重くないか?スピードは?

若干、遅い気もします。
でも、仕方なくね…

これで無事完了しました。

というわけで今回は以上です。

なんか、想像以上に時間がかかっちゃいました。
やってることは単純なのに、作業するたびにコードを書かなきゃいけないって不思議ですね。
リダイレクトに関しては情報も少なかったので、まだまだ発展可能性がある分野だなと思いました。

-WordPress