概要
色々悩みましたが、パーマリンクを以下のように変更しました。
変更前
/%category%/%year%%monthnum%/%postname%/
変更後
/%postname%
変更理由
当初は、パーマリンクに[/%category%/%year%%monthnum%/]を含めることによって、カテゴリ、年月ごとに同じ名前の[%postname%]を使いたい、という目論見があったのですが、実際にパーマリンクを設定してみると[%postname%]に同じ名前が使えない事に気づきました。
例えば[cat1/201810/post]という投稿がある場合、[cat2/201810/post]という投稿をしてもパーマリンクが自動的に[cat2/201810/post1]というように末尾に数字がついて意図した通りにならないのです。
だいぶ前から気がついては居たのですが、パーマリンクの設定を変えてしまうと検索エンジンからの流入が「ページが見つかりません」(404エラー)になってしまうので躊躇していましたが、早めにやっておかないと手間が増えるだけだと思い、今回決行することにしました。
404エラー対策をどうしようか、と調べてみたところ、WordPressのプラグインで正規表現を使ったリダイレクトが行える「Redirection」というプラグインがあることがわかりましたので、これを使って対策してみることにしました。
WordPressプラグイン「Redirection」
このプラグインでは以下のような設定でリダイレクトが行えます。
- リダイレクトルールに正規表現を使用可能
- リダイレクト回数や404エラーをログに記録してくれる
- リダイレクトの種類(301、302、307等)を指定できる
正規表現が使えることがポイントで、パターンを指定することで記事一つ一つに対してリダイレクトの設定を行わなくてすみます。
Redirectionの設定画面は「ツール」「Redirection」から表示可能です。
転送設定

ソースURLに転送元のURLを、ターゲットURLに転送後のURLを設定し、正規表現チェックボックスにチェックを入れます。
URLは「ドメイン以降」のURLを入力します。
当サイトなら
「https://deisy.jp」
の部分は入力不要ということになります。
一般条件は「URLのみ」、マッチした時は「URLへ転送」、HTTPコードは301を設定します。(HTTPコードの詳細は後述)
パターン1
カテゴリ直下に記事がある場合(/blog/201802/wpmake/のようなURL)、[/wpmake]へリダイレクトするための設定。ただしサイドメニューの「カテゴリー」を選択した場合、[/category/*]というアドレスになるためこちらは転送したくない、ということで以下のように設定
ソースURL:/(category)(.*)/(.*)/(.*)/
ターゲットURL:/$3
最初のパスで[category]が含まれている場合は転送しない、それ以外の場合は転送する、と設定しているつもりなのですが、カテゴリ選択後に改ページするとリダイレクトされてしまうパターンがあり、解決できないので1頁に表示する記事数を増やしてそもそも改ページされないようにする、という対策でお茶を濁しています。
パターン2
カテゴリ/カテゴリ以下に記事がある場合(/social-network-game/kankore/201808/release/)に、[/release]の設定。
ソースURL:/(category)(.*)/(.*)/(.*)/(.*)/
ターゲットURL:/$4
ソースURLの[(.*)/]が一つ増えて、ターゲットURLが$4になっています。
リダイレクトの種類
301 恒久的に移動
「今後転送元のURLは誤りとし転送後のURLを正として扱う」リダイレクト。今回は変更後のアドレスを正しいものとして扱いたいのでこの転送を指定しました。
302 発見
「一時的に転送元のURLを使用せず転送後のURLを参照するよう扱う」リダイレクト。サーバーのメンテナンス時に全てのページをメンテナンス中ページへ転送するような場合に使用されるようです。
303 See Other
「転送元へのアクセスはPOSTで行ったが、レスポンスは転送先からGETで取得したいときに使用する」リダイレクト。ユーザーによる問い合わせフォームでの送信後にお礼のメッセージを表示する場合なんかに使えそう?(ただし伝統的に、303の代わりに302を使用しているWebアプリケーションも多いらしい)
304 Not Modified
未更新を表すコードで、厳密にはリダイレクトではないようです。この応答をブラウザが受け取ると、キャッシュを使用してwebページを表示してくれます。
307 一時リダイレクト
「302と同様だが、POSTからGETへの変更を許可しない」リダイレクト。POSTメソッドには大きなデータやファイルを含ませる事ができますが、これをリダイレクトによりGETメソッドに変更することで、問題が生じることを回避するために定義されたリダイレクトです。 サーバー側でHSTSという機能を有効にしている場合にhttpで始まるURLにアクセスすると、ブラウザがそれを解釈してhttpsで始まるURLにリダイレクトする場合、このコードが使用されるようです。(この場合はサーバー側でのリダイレクトではなく、ブラウザによるリダイレクトが行われます)
308 恒久リダイレクト
「301と同様だがPOSTからGETへの変更を許可しない」リダイレクト。
結果
確認前にはブラウザのキャッシュをクリアしておくことを推奨します。301で転送した場合、一度転送した内容がブラウザに記憶されるため、設定変更⇒試す1⇒再度設定変更⇒試す2としたとき、試す1の内容で転送されてしまう場合があるためです。
キャッシュクリア後、以下の内容を確認してみます。
- いくつかの記事で以前のURLにアクセスする⇒正常に転送される
- 全てのカテゴリで記事一覧を表示する⇒正常に転送される
- [艦これ 海域開放]でぐぐって該当記事を表示する⇒正常に転送される
どれも404にならず、正常に転送ないし表示されました。
以後の運用
Redirectionには404エラーが発生した際にログを記録してくれる機能があります。転送の設定ミスで404エラーが発生した場合はログに残りますので、しばらくの間404エラーが発生しているかどうかを観察し、抜けがないか確認していく必要がありますね。
不可解な404エラーログの出力
監視していたところ謎の404エラーログが出力されていたため、対策を行いました。以下の別記事にまとめています。

コメント