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.リダイレクトさせたい理由
リダイレクトさせたい理由は、いくつかのパターンに別れると思います。
- サイトを移転してURLを変更した時
- wwwが付いたURLでアクセスされた時に、ないURLに飛ばす
- httpでアクセスしてきた人を、httpsへ飛ばす
- サイトをマルチサイト化して、URL構造が変わったため、新しいURLへ飛ばす
- 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/
すべて、ちゃんと移動しました。
重くないか?スピードは?
若干、遅い気もします。
でも、仕方なくね…
これで無事完了しました。
というわけで今回は以上です。
なんか、想像以上に時間がかかっちゃいました。
やってることは単純なのに、作業するたびにコードを書かなきゃいけないって不思議ですね。
リダイレクトに関しては情報も少なかったので、まだまだ発展可能性がある分野だなと思いました。