WordPressのパーマリンクを変更して301リダイレクト処理

WordPressのパーマリンクを変更して301リダイレクト処理

記事の URL が長いので、WordPress のパーマリンク構造を変更しました。作業の大まかな流れは、「パーマリンクの決定」→「記事/カテゴリ/タグの URL を取得」 →「テキストエディタで文字列の置換」→「 301 リダイレクトの為に .htacess を編集」で、リダイレクトの為の Permalink Redirect などの WordPress のプラグインは使用していません。

パーマリンク( Permalink or permanent link )については、WordPress.org の説明が分かりやすいです。永続的に変わらない URL になります。

パーマリンクは、ブログの個別投稿やカテゴリーなどの投稿一覧ページへの恒久的(半永久的)な URL です。パーマリンクは、他のブロガーがあなたの記事(やセクション)へリンクを張ったり、あなたの文章へのリンクを電子メールで送ったりするときに使います。他のブロガーがリンクを張ることがあるため、個別投稿への URL はいつでも存在して決して変らないようにすべきです。パーマリンクは、恒久的 (長期間有効) であることを意図しています。
ブログ入門 | WordPress.org 日本語

元々ブログは静的な HTML で作成していましたが、2003 年に Movable Type を導入、2009 年 6 月に WordPress(バージョン 2.7 )へ移行して以来、以下のように年代と日付で管理する記事 URL にしていました。


WordPress パーマリンク設定
/blog/archives/%year%%monthnum%/%postname%.html
↓
実際の URL 例
https://www.ken-g.com/blog/archives/201911/記事名.html

めっちゃ長い URL でした。
ブログは、KEN-G.COM にある 3 つのコンテンツの中の 1 つであったので、上記のようなURL 構造になっていました。

ウェブサイトの URL 構造については、1 つの指標として、Google の以下のページを参考にしました。

サイトの URL 構造はできる限りシンプルにします。論理的かつ人間が理解できる方法で(可能な場合は ID ではなく意味のある単語を使用して)URL を構成できるよう、コンテンツを分類します。たとえば、航空機(aviation)に関する情報を探している場合、http://en.wikipedia.org/wiki/Aviation のような URL であれば、見ただけで必要な情報であるかどうかを判断できます。http://www.example.com/index.php?id_sezione=360&sid=3a5ebc944f41daa6f849f730f1 のような URL 自体は、ユーザーの関心を引くことはほとんどありません。
Google Search Consoleヘルプ - シンプルな URL 構造を維持する

最近は、URL を SNS などでシェアするとプレビューが表示されたり、ブラウザの URL 欄(アドレスバー)には初期設定ではドメインしか表示しないブラウザが多いし、Google の検索結果に完全なアドレス( URL )が表示されることは少ないので、余り URL を意識することは少ないと思います。

とはいえ、ウェブサイトを運営している側から考えると、WordPress のデフォルトの https://www.ken-g.com/?p=123 ならタイトルを考える手間は省けるけど、Google の言う「人間が理解できる」とは相反するし、記事の URL に https://www.ken-g.com/category/seo/記事名/ とカテゴリ名を入れると後々カテゴリ名を変更し難くなります。

Google の「サイトの URL 構造はできる限りシンプルにします。論理的かつ人間が理解できる方法で(可能な場合は ID ではなく意味のある単語を使用して)URL を構成」を意識しつつ、ウェブサイトの構成や運用方法によって決定するのがベターかと思います。

随分と長い間、シンプルな URL に変更したかったので、以下のようにしました。


WordPress パーマリンク設定
/%postname%/
↓
実際の URL 例
https://www.ken-g.com/記事名/

記事は「年月」で管理していたので、命名規則は余り意識していませんでしたが、「記事名」だけだと同じ階層に記事が存在するので、命名規則を決めないと煩雑になりそうです。

WordPress は、カテゴリとタグがあるサイト構造なので、

  • https://www.ken-g.com/article/記事名/
  • https://www.ken-g.com/category/カテゴリー名/
  • https://www.ken-g.com/tag/タグ名/

と、記事であることの「article」か「post」を入れた方が良かったかなと、少し後悔してますが、短くなってスッキリです。

www は「有り」に

この際に「 www 無し」にしようかと思いましたが、URL には ホスト名の部分に www かサブドメインが無いと個人的に落ち着かないので、そのままにしました。

トレイリングスラッシュは「有り」に

URL の最後にあるスラッシュ( / ) は、「有り」にしました。
トレイリングスラッシュ( trailing slash )と言われるスラッシュです。これも個人的にディレクトリ扱いでスラッシュがないと落ち着かないので、スラッシュ有りにしました。

www や トレイリングスラッシュは、「有り無し」が統一されていれば気にする必要はありません。

301 リダイレクトと SEO の効果について

記事の URL を変更すると、検索エンジンの結果で表示されるページの URL を変更する必要があります。何もしなくても検索エンジンにインデックスされますが、せっかくの記事の SEO の効果(ページランクなど検索順位に影響するもの)が無くなるのは勿体ないですね。

そこで SEO の効果を継承させる為に、サーバーサイドで URL の移動を知らせる 301 リダイレクトをする必要があります。
※ メタタグ( http-equiv="refresh" )での URL の遷移は、W3C や Google でも推奨されていません。

検索エンジンの結果で表示されるページの URL を変更する必要がある場合は、サーバー サイドの 301 リダイレクトを使用することをおすすめします。これは、ユーザーや検索エンジンが正しいページにたどり着くことを保証する最善の方法です。
ページの URL の変更と 301 リダイレクトの使用 - Google Search Consoleヘルプ

301 リダイレクトは、URL が「永続的」に変更された場合に使用する転送処理のステータスコードです。 転送のステータスコードとしては、他に 302 リダイレクトがありますが、「一時的な転送」を意味します。

現在 Google では、302 でもページランクを新 URL に引き渡すようです。

新しい URL にリダイレクトすると、リンクのクレジットは失われますか?
いいえ。301 や 302 のリダイレクトは PageRank の損失につながりません。
概要: URL の変更を伴うサイト移転 - Search Console ヘルプ

また、Google の Gary Illyes の発言が掲載されている 301・302リダイレクトはどちらもPageRank喪失なし、好きな方を使って構わない #StateofSearch 2017(海外SEO情報ブログ)によると 302 でも「永続的」な URL として時間はかかるが最終的に処理するとのこと。しかし、完全な URL の変更と分かってる場合は、301 を推奨しています。

301 リダイレクトの為に記事 URL の一覧を取得

記事のパーマリンクが /%postname%/ に決定したので、次に 301 リダイレクトの処理をする為に公開中の WordPress の記事の URL 一覧を取得します。取得した URL 一覧は、コピーしてテキストファイルとして保存してください。

記事の URL 一覧の取得方法は、以下の 3 つがあるかと思います。

  • PHP などのプログラムで取得する
  • WordPress のプラグインをインストールして取得する
  • MySQL のデータベースから取得する

PHP などのプログラムで取得する

How to Get a List of All WordPress Post URLs の「Get a List of URLs Manually Without Installing a Plugin」に掲載されている PHP プログラムで記事の URL 一覧を取得することができます。

上記のウェブサイトのコードをファイル名 export.php などにして保存し、サーバーにアップロード。アップロードした URL、例えば http://yourdomain.com/export.php にウェブブラウザでアクセスすると以下の画像のように記事の URL 一覧が表示されます。

WordPress PHP で記事一覧を出力
WordPress PHP で記事一覧を出力

※ サブディレクトリに WordPress をインストールされてる場合は、サブディレクトリにファイルをアップロードしてください。

アップロードしたファイルは、作業が終わり次第削除をおすすめします。

WordPress のプラグインをインストールして取得する

Export All URLs という WordPress のプラグインを使用しました。
以下の画像は、記事の URL 一覧を書き出す際の設定画面です。

WordPress プラグイン Export All URLs の設定画面
WordPress プラグイン Export All URLs の設定画面

※ CSV で書き出す場合は、「Show Advanced Options」で保存先を選択できます。
※ カテゴリーとタグの URL は出力されません。

MySQL のデータベースから取得する

PHP か WordPress のプラグインで十分なので、試していません。

ここまでで、「パーマリンクの決定」と「記事の URL 一覧を取得」したので、次の項目からは、記事の URL を 301 リダイレクトして、新しい URL に遷移させる処理を作成する作業になります。

Redirect を使った 301 リダイレクトの書き方

301 リダイレクトは、サーバーを制御することができる設定ファイル .htaccess にコードを書く必要があります。

私の場合、Apache モジュール mod_rewrite の RewriteRule で正規表現を使ったリダイレクトの記述では完全に動作しなかった(※1)ので、Apache モジュール mod_alias の Redirect を使って、個別にリダイレクトするコードを書きました。

※1 mod_rewrite は仕様できるサーバーなので、サブディレクトリに WordPress をインストールしているのが原因かと思います。記載の順序なども変更してみましたが勉強不足のため解決しませんでした。

Redirect の構文は、以下のようになります。


Redirect [status] URL-path URL

[status] は、永久にリダイレクトをするステータス(301)を返す permanent を使用して、今回のパーマリンク変更では以下のようになります。


Redirect permanent 旧URL 新URL

旧URL の部分は、/(スラッシュ)から始まるルートパスで、新URL の部分は、http から始まる絶対パスで記述します。


Redirect permanent /blog/netflix.html https://www.ken-g.com/netflix/

上記の形式に合わせる為に、表計算アプリ( Microsoft Excel や Numbers など)とテキストエディタで、URL を修正/変更します。
私の場合、表計算アプリの Numbers(バージョン 6.1 )では正規表現を使った置換ができない為、旧URL と新URL の修正/変更はテキストエディタを使用しました。

旧URL を修正する

WordPress 301 リダイレクト 旧URL
WordPress 301 リダイレクト 旧URL

取得した記事の URL を /(スラッシュ)から始まるルートパスに修正します。私の場合は、https://www.ken-g.com を検索ワードとして、置換するワードは何も無い状態にして、置換をしました。

新URL に変更する

WordPress 301 リダイレクト 新URL
WordPress 301 リダイレクト 新URL

取得した記事の URL を 新しいパーマリンク設定 /%postname%/ に合う形式に変更します。
私の場合、201912 など年月や拡張子 .html が URL に入っているので、以下のように正規表現を使って置換しました。


検索ワード
/blog/archives/([0-9]{6})/(.*)\.html

以下に置換
/$2/

([0-9]{6}) は 0 から 9の数字が 6 文字ある場合、(.*) は任意の文字列、(半角のバックスラッシュ)は拡張子のドットをドッド記号と認識させる為のエスケープ処理、$2 は2番目の変数、といった意味になり、実際の処理は以下のようになります。


検索ワード
/blog/archives/201912/svod-netflix.html

以下に置換
/svod-netflix/

表計算アプリ( Numbers )で Redirect permanent の形式を作成する

WordPress 301 リダイレクト Numbers で作成
WordPress 301 リダイレクト Numbers で作成

※ テキストエディタで Redirect permanent 旧URL 新URL の形式にできる場合は、表計算アプリを使う必要はありません。

Redirect permanent、旧URL、新URL と列を 3 つ作成します。
Redirect permanent の行は、全て同じです。旧URL、新URL は、これまでに作成したデータをペーストします。

この段階で、半角スペースは Redirect permanent の Redirect の後の半角スペースのみですので、チェックして削除してください。全角スペースやタブはありません。

テキストエディタで整形する

上記の項目で作成したデータを全て選択してコピーし、テキストエディタにペーストします。Redirect permanent、旧URL、新URL の文字列の間にタブなどが入る場合は、一括置換で半角スペースに変換します。全角スペースやタブは削除してください。

Redirect permanent 形式では、半角スペースは 3 カ所
Redirect permanent 形式では、半角スペースは 3 カ所

以上で 301 リダイレクトに必要なコードの作成は完了です。

ここまでで、新しいパーマリンクと 301 リダイレクト用のコードが揃いましたので、パーマリンクの設定で WordPress の 記事 URL を変更して、301 リダイレクト用のコードを .htaccess ファイルに追加して完了です。
WordPress パーマリンク設定画面
WordPress パーマリンク設定画面

WordPress 管理画面の「設定」メニューにある「パーマリンク設定」から変更します。

今回パーマリンクを /%postname%/ に決定したので、WordPressのパーマリンク設定の共通設定では、「投稿名」になります。
もしくは「カスタム構造」の箇所に /%postname%/ と入力しても同様になります。

パーマリンクの変更と 301 リダイレクト処理は、タイミングによっては記事ページが表示されない事があるので、ほぼ同じタイミングで設定するのが良いかと思います。

301 リダイレクトのコードを .htaccess に追加

サーバーを制御することができる設定ファイル .htaccess に作成した Redirect permanent のコードを挿入して完了です。サーバーのルートにある .htaccess です。

.htacess.(ドット)から始まる不可視ファイルなので、FTP アプリ上で表示されない場合は、設定で不可視項目を表示する設定にしてください。

記事は、350 ほどあるので、長い行になりました。

.htaccess 内の記述ミスで、ウェブサイトが 500 internal server error で表示されなくなったり、リダイレクトが永遠にループするなどがありますので、.htaccess をバックアップをするなどご注意ください。

.htaccess をバックアップ

不可視項目なので、ローカルにバックアップする為にダウンロードしても Finder に表示されません。

Mac の場合、不可視ファイルを表示するには、command+shift+. を同時に押すと不可視ファイルが表示されるようになります。元に戻すには再度同じキーコンビネーションを押してください。

.htaccess の書き方(挿入する位置)

301 リダイレクトのコードを配置場所ですが、WordPress が書き込む # BEGIN WordPress や、すでにリダイレクトが記載されている場合、例えば、www 有り無しや http → https などは、それらの後に今回の Redirect permanent を配置する方が良いかと思います。

参考までに、リダイレクトの回数については、Google の以下の文章によると 最大 5 回までと記載があります。

通常、有効な結果が見つかるまで(またはループが検出されるまで)、リダイレクトに従います。一定のホップ回数(RFC 1945(リンク先は英語)では HTTP/1.0 で最大 5 回のホップを許可しています)までリダイレクトした後、停止して 404 として処理します。
HTTP 結果コードの処理 Robots.txt の仕様 | Google検索

301 リダイレクトの確認の方法

ウェブブラウザで確認する方法と Google Chrome の機能拡張を入れて確認する方法があります。

Safari、Google Chrome で確認する方法

Safari、Google Chrome のウェブブラウザで確認するには、以下のキーコンビネーションを同時押しして、Web インスペクター( Chrome はデベロッパーツール)を開きます。

command+option+i

開いた状態で、旧URL にアクセスします。すると Web インスペクター( Chrome はデベロッパーツール)の「ネットワーク」タブに読み込んだファイルが表示されるので、記事の URL のファイル名をクリックして「ヘッダ」( Chrome は Headers )を表示します。

Safariで301リダイレクトのチェック
Safariで301リダイレクトのチェック
Google Chromeで301リダイレクトのチェック
Google Chromeで301リダイレクトのチェック

上記の画像のように「旧URL」のリクエスト後に、Safari の場合「応答をリダイレクト」に 301、Chrome の場合 Response Headers のStatus が 301 と表示されて、「新URL」に遷移していれば問題ありません。

Google Chrome の機能拡張 Redirect Path で確認する方法

301 リダイレクト確認 Chrome 機能拡張 Redirect Path
301 リダイレクト確認 Chrome 機能拡張 Redirect Path

Chrome 機能拡張の Redirect Path を使いました。

上記の画像のようにリダイレクトの遷移が表示されます。
「旧URL」でアクセスして、ステータスコードが 301 で「新URL」に遷移していれば問題はありません。
www 有り無しや http → https などの遷移も同時に確認できるので、オススメの機能拡張です。

以上で、WordPress のパーマリンクの変更は終了です。
記事間の内部リンクについては、301 リダイレクトされているので、404 File not found になる事はありませんが、WordPress プラグインのSearch Regex などで変更するのが早いと思います。

あとは、Google の検索結果に反映されるのを待ちます。

Google に認識されているか Google Search Console で確認

Google Search Console のサイトマップ画面
Google Search Console のサイトマップ画面
Google に URL の変更を伝えるために、Google Search Console で サイトマップ( sitemap )を送信しておきましょう。
同じ URL やサイトマップに対して再クロールを何度もリクエストしても、クロールが速くなるわけではありません。

※ Google Search Console の「URL 検査ツール」で個別の URL を Google インデックスに送信することもできますが、今回は記事ページ全体の URL 変更なので、サイトマップの送信が良いと思います。

Google Search Console で サイトマップ( sitemap )を送信してから、Google の Googlebot(メインのクローラ)がウェブサイトに来るまでには、数日から数週間かかることがあります。

進行状況は、Google Search Console の「インデックス ステータス レポート」または「 URL 検査ツール」で確認することができます。

パーマリンク変更の影響とその後

私の場合、Google の検索結果に新URL が反映され始めたのは、1 週間ほど経ってからで徐々に変わっていきました。2 〜 3 週間ほどで全 URL が反映された感じです。

反映途中は、「重複しています。送信された URL が正規 URL として選択されていません。」や正規 URL が旧URL になったりと色々とありましたが、最終的に正常に認識されました。
なかなか個別の URL が反映されない場合は、Search Console の「URL 検査ツール」の「公開 URL をテスト」からGoogle インデックスに送信すると少し早くなるかもしれません。

Google の検索順位の変動は誤差の範囲で、大きな変化はありませんでした。特に順位が上がった記事もありません。一度はガクッと順位が落ちるかな?と考えていましたが杞憂でした。

ただ、せっかく記事ページでシェアして頂いた回数が消えてしまったサービスがあるのが残念です。
※ はてなブックマークに関しては、はてなブックマーク開発ブログの URLが複数存在する同一ページでコメント一覧ページが分散する仕様を、統合されるよう変更します に書いている通り、徐々に URL の統合がされているようでシェア回数が戻ってきています。

コメントをどうぞ

コメントは確認後に反映されます。
コメント内容、名前(ニックネーム可)、メールアドレスの項目は必須となります。メールアドレスは公開されません。