WordPressで作っているサイトでリダイレクトをかけたい場合、.htaccessで行うことが多いかと思います。多いかと思います、と言いつつ私は今回初めて実装したのですが、数時間の格闘の上、stgでの実装に成功!
しめしめ…と本番反映しようとしたところ、なぜかstgでは効いた.htaccessが本番で機能しない。こんなことがあっていいのか、否、よくない。
*WordPressでの.htaccessで参考にしたのはこちらの記事。この記事は何も悪くないです。
WordPressで.htaccessリダイレクトができない場合【解決】
しかし急いでいたこともあり、ひとまず.htaccessの検証は後回しにしてWordPressのfunction.phpでリダイレクトを実装することに。まあこちらも不慣れなもんでしてね。数時間の格闘の上、やっと実装に成功したってもんです。
特に正規表現!!難しいですねー備忘録を残しておきましょう。
やりたいこと:
- URI /blog/以下のページを302リダイレクト(一時的)させたい
- Englishページ(/en/blog/)もあるのでそれもリダイレクト
- /blogxxxxのようなURIは404に
まずはfunction.phpの頭にコードをプラス。
<?php
$request_url = $_SERVER["REQUEST_URI"];
$redirect_match = preg_match("ここに正規表現が入るよ", $request_url);
if($redirect_match === 1){
wp_redirect(home_url(), 302);
exit;
}
$request_urlでアクセスしたページが正規表現とマッチするか判定して、マッチするならホーム画面に302リダイレクトで飛ばします。
preg_matchについては下記参考
preg_matchでは、ある文字列から正規表現で指定したパターンにマッチした文字列を検索できます。
パターンにマッチした場合は1を返し、マッチしなかったら0を返します。
PHPのpreg_matchで正規表現によるマッチングする方法より
そしてお次に、"ここに正規表現が入るよ"の箇所に正規表現を入力していきます。
正規表現ってなんぞ?という方は、いろいろなサイトが解説してくれているのでぜひ。
正規表現入門
正規表現がなんたるかはわかっているものの、どの記号がなんだっけ?というのを見ながら自分で書きたい方は「regex cheatsheet」で検索するのがおすすめです。regexはregular expressionの略ですね。
私はこちらのサイトを使用しています。
Quick-Start: Regex Cheat Sheet
チートシートを見ながら下記のサイトで正規表現の書き方が合っているか、確認してからファイルに書き込んでいます。めちゃ便利!
PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.1
まず最初に書いたのはこれ。
$redirect_match = preg_match("/^\/en\/blog\/|^\/en\/blog$|^\/blog\/|^\/blog$/", $request_url);
*正規表現は/で最初と最後を囲むよ
- /en/blog/
- /en/blog
- /blog/
- /blog
の4パターンをORでつないでいる形です。めちゃ長い!頭悪そうやんけ!!
blog$のように「\$」をつけているのは、URLが「blog」で終わることを示しています。
例えば/blogxxx といったページにアクセスした際は、302リダイレクトではなく404を表示させたいからです。
blog/のようにblogの後に/がついている場合は、その最後の/がURLの最後の文字とは限らない(/blog/catや/blog/cat/foodなど)ので、$は入れていません。
余談ですが、このfunction.phpをサーバにアップした時の確認方法です。
- Chrome developer toolを開く
- /blog/にアクセス
- NetworkタブからNameの
blog/
を選択し、header情報などを確認
↓この辺
Request URL: https://xxx/blog/
Status Code: 302
location: https://xxx(HOME)
それにしても待てよ?今/blog/がURIに入っているページで公開しても良いページなんてないのだから、そもそも/en/自体入れなくても良いのでは?
と気づき、下記に変更しました。
$redirect_match = preg_match("/^(\/.*)?\/blog\/|^(\/.*)?\/blog$/", $request_url);
(\/.*)?
で、/xx(何文字でもいい)が0回か1回以上ある時、という条件を追加しています。これで、/en/が入っていないURLを叩かれた場合でも/blog/ページをリダイレクトさせることができます。
ただ正直これでもええんちゃうん?と思わずにはいられない。
$redirect_match = preg_match("/\/blog\/|\/blog$/", $request_url);
// URIに/blogが入っていたら全部リダイレクト
ただあまりにも縛りが緩いと思わぬ穴があるかもしれないと思って一応直上のコードは書いていません。
誰かお詳しい方おられたら、ご教示いただけますと幸いです…