【随時更新】サイト移行やパーマリンク変更、301リダイレクトについて

去年、はてなブログProからWordpressにサイトを移行したが、改めてはてなブログProに戻すことにした。

<本記事の流れ>

運営しているワードプレスのサイトが、パーマリンクを変更しなくてはいけなくなり、記事前半はその話。後半でWordpressからはてなブログProへの移行について書きたいと思います。

目次
1. はてなブログProに戻す理由
2. パーマリンク変更の影響
3. 最適なパーマリンクとは
4. 301リダイレクト
5. 作業1 現在のサイトのバックアップを取る
6. プラグインを使うことに
7. 301リダイレクト .htaccessで行う方法

→過程を記録しながら作業していますが、結局、はてなブログに移動はペンディング、301リダイレクトの段階で止まっています。随時更新中。

はてなブログProに戻す理由

WordPress5.4.1の自動アップデートにより私の運営しているサイトに障害が発生しました

/%year%/%monthnum%/%day%/%hour%%minute%%second%/というパーマリンク構造を選択していましたが、トップページから個別記事(single.php)にアクセスできません。記事をクリックすると、トップページに戻ってしまうという無限ループ状態になりました。

ワードプレスの説明だとセキュリテイの脆弱性の対策でこの構造のパーマリンクを不可にしたとのことです。

ソース↓(Wordpress公式フォーラムより)

モデレーターの

のむらけい (Kei Nomura) (@mypacecreator)さんの投稿によると

この変更がなされた理由について、@ishitaka さんがTwitterで以下の情報を教えてくださいました。

Unpacking The 7 Vulnerabilities Fixed in Today’s WordPress 5.4.1 Security Update
https://www.wordfence.com/blog/2020/04/unpacking-the-7-vulnerabilities-fixed-in-todays-wordpress-5-4-1-security-update/

This indicates that it was possible for an attacker to view private posts by using date and time-based queries, though only for protected posts that were created or updated at the exact same time, down to the second, as an unprotected post.

また、英語版フォーラムで、コミッターご本人からの回答もありました。
https://wordpress.org/support/topic/why-class-wp-query-php-was-changed-in-wordpress-5-4-1/

2つの情報をまとめると、同じ日付/時間/分/秒で公開された複数の投稿が存在する可能性があるためクエリ判定条件として適切ではないこと、また実際に複数の投稿があって2件目以降に非公開記事があった場合、非公開状態のものが見えてしまう問題があるための修正とのことです。

セキュリティー上の問題がある以上、この変更が戻されることはないと思われますので、それぞれのブログの運用状況を考慮しつつパーマリンクの再検討はすべきかと思います。

とのことです。

はぁ〜今年一番のショックです。。

パーマリンクを変えることはサイト運営者にとっては致命的です。わたしの該当サイトは272記事だからまだ良いですが1000記事以上ある方に対しては、言葉が出ません。

パーマリンク変更の影響

パーマリンクは一度決めたら変えないのが基本です。これを変えると以下の影響が出てしまいます。

・今まで積み上げてきたSEO効果がリセットされる

仮にいいね!を1万件もらっていても、その成績(SEO効果)はゼロになります。

・検索結果に表示された記事をクリックすると「この記事は存在しません」とエラー表示される。

私のサイトはホテル名が強く、ホテルによっては公式HPの次くらいに上位表示される記事がありますが、クリックされても記事は表示されません。

・記事内のリンクを変える必要がある。

サイト内でかなり多くの記事をリンクさせていると、方法にもよりますが、それらがすべてリンクエラーとなることもあります。修正に膨大な時間を要します。読んでいる方に不快感と不信感を与えてしまいます。


サイトを収益化している場合、1つめ2つめがやはり大問題です。アクセス数の激減、アドセンス報酬をはじめとした収益は大幅に減ることになります。

私の該当サイトはこの事象前後で比較すると、アクセス数、アドセンス報酬が10分の1くらいになりました。

しかし落ち込んでいても仕方がありません。対策をすぐにはじめないといけません。

まずは新しいパーマリンクをどうするか決める必要があります。

最適なパーマリンクとは

最も良いパーマリンクはGoogleも発表しています。

「カスタム構造」で記事内容を英語表記で簡潔に示したもの

最も良いと言われているのはこの一択です。(ただ、この中にはカテゴリーを含めるか含めないか、の選択肢があります。)

カテゴリーを入れるとかなりすっきりしますが、デメリットもあります。カテゴリーを定義してしまうと後からカテゴリー変更した場合に支障がでる可能性があります。

サイト構築をはじめからきちんとして変更する必要がないと思われる場合以外は、/%postname%/ が一番良いと思われます。

私もはじめこの形にしようと思いましたが、最終的には数字ベースを選択することにしました。(以下のサイトを参考にさせていただきました。)

わたしのサイトはホテルを扱っています。ホテル名が途中で変わることがあるのでこれを選ぶことにしました。

<最もよいパーマリンクのまとめ>

最もいいと言われているのは、/%postname%/ というパーマリンクです。

しかし、パーマリンクを変えるのが最も良くないので、そうならないもの、今回のような運営者側によりNGにされる可能性が小さい(であろう)形式をを選ぶのが良いように思いました。

変更前に必ずログを取ること

パーマリンクを変える前には必ずログを取りましょう。変更はラジオボタンで簡単にできてしまうため、注意が必要です。

わたしはスプレッドシートで記事管理をしていたのですが、10記事ほどリンクを記録していないままパーマリンクを変更してしまいました。

(変える前ならCSVでエクスポートが可能です。

仮に旧リンクがわからなくなった場合は、アナリティクスなどで確認できます。わたしは仕方なくそうしましたが、とても面倒な作業です。

301リダイレクト

パーマリンクを変更して欠かすことができないのが301リダイレクトです。旧リンクにアクセスされると新しいサイトへ自動的に飛ばしてくれる仕組みです。

これで壊滅的状況にある私のサイトに旧サイトの力を与えることができます。

301リダイレクトには主に3つの方法があります。

サーバー経由

プラグインの利用

Javascript

サーバー経由が一般的ですが、記事数が多いと記述が大変。また割とテクニカルなため、ワードプレスならプラグインを使うのも手だと思います。ただプラグインによっては挙動が不安定でうまくリダイレクトできないなどの不具合も発生しているようなので情報を集めてから利用したいところ。

Javascriptはブラウザ上でリダイレクトをかけてくれます。デメリットはブラウザによって動かないことがあること。

わたしの該当サイトは、はてなブログProに移行予定です。はてなブログは301リダイレクトの仕組みがありません。そのためJavascriptを使うことになります。

参考記事

ちゃんと動いてくれるかな。

301リダイレクトはいつまでかければいいの?

はてなブログに移転することを見込んでおり、ここも他のブログサービスを使うかも・・・場合によってはわたしはサーバーの契約を解約してしまうかもしれません。仮にサーバー経由のリダイレクトを選択した場合に関わる話ですが、リダイレクトっていつまでかければいいのだろう?とふと思いました。

調べていたら興味深い記事がありました。

グーグル公式「301リダイレクトは1年経ったら外していいよ」発言の真意とは?【SEO記事12本まとめ】

上の記事は、2019年1月のものです。

これによると、リダイレクトをやめていいっていうことでもないけど、ずーっとかけておく必要があるとも言えなさそう。目安としてこんな感じで捉えておくのもいいのかも。

ここからサイト移行をしていきます。

作業1 現在のサイトのバックアップを取る

E

去年サイトをはてなブログProからワードプレスに変えたので、逆のことをすればよいためあまり緊張しません。

移行によって影響がでること、しなければいけない作業は、以下都度記録していきます。(あとでまとめます)

記事のバックアップを取る。

ダッシュボード>ツール>エキスポート>「すべて」を選択し、実行。

XML形式でデータがダウンロードされます。簡単。

と思ったけど、アイキャッチ画像はダウンロードされないため、以下記事を参照に、プラグインを入れます。

WordPressの記事移転時にアイキャッチを引き継ぐ方法

これを見ていたら、とてもやることが多いので、プラグインを使い、301リダイレクトをかけることに。はてなブログへの移行は一旦ペンディングです。

プラグインを使うことに。

ワードプレスで301リダイレクトができるプラグインを探します。

参考 301リダイレクトプラグインでパーマリンク変更を62秒でケリをつける!

こちらが簡単そうです。Permalink Redirectというプラグインが紹介されています。しかし大変見やすい記事ですね。参考にしたいです。

2018年の記事だし、プラグインに不具合が出ていないだろうか。以下に気になる記述がありました。

wordpress 5.4.1 からの障害について

この中で、Permalink Redirectはリダイレクトが終わるまでは404エラーが出ると書かれています。そのためCustom Permalinksというプラグインが紹介されていますが、私は「数字データ」を選択するし、Permalink Redirectでいい気がします。

作業をしてみよう。

わかりやすそうなので、以下記事も参考にさせていただきます。

WordPressでパーマリンクを変更したときに全記事リダイレクトを行う

2019年の記事ですね。最近、投稿日時を表示しない記事が非常に増えましたが、いつの記事か表示させてくれているのでありがたいです。

まず、プラグインのphpファイルをダウンロードします。と思ったら記事内で紹介されているリンクが切れてます。ワードプレス内で検索しましたが『Permalink Redirect』は公式ディレクトリに登録されていないことも判明。

**

調べたところ、上のプラグインは現在ダウンロードできなくなっていました。

他に良さそうなプラグインも見つかりません。

上記のWordpress公式フォーラムの今回の障害についてのページで、リダイレクトのコードを公開している方がおられました。

/*
/%year%/%monthnum%-%day%_%hour%%minute%%second%.html
↑が404を返すようになったので、急遽↓に変更。
/%year%/%monthnum%-%day%_%hour%%minute%%second%_%post_id%.html
*/
function redirect_to_new_permalink() {
 $target_str = $_SERVER[ 'REQUEST_URI' ];
 if ( !is_single() && preg_match( '/\/(\d{4})\/(\d{2})-(\d{2})_(\d{2})(\d{2})(\d{2})/si', $target_str, $day_result ) ) {
 $args =[  'post_type' => 'post'
 , 'posts_per_page' => 1 
 , 'post_status' => 'publish'
 , 'no_found_rows' => true
 , 'ignore_sticky_posts' => true
 , 'suppress_filters' => true
 , 'date_query' => [ [
   'year' => $day_result[ 1 ]
 , 'monthnum' => $day_result[ 2 ]
 , 'day' => $day_result[ 3 ]
 , 'hour' => $day_result[ 4 ]
 , 'minute' => $day_result[ 5 ]
 , 'second' => $day_result[ 6 ]
    ] ]
 ];
 $the_query = new WP_Query( $args );
 if ( $the_query->have_posts() ) {
 $url = '';
 while ( $the_query->have_posts() ) { $the_query->the_post();
 $url = get_permalink();
 }
 if ( !empty( $url ) ) {
 wp_safe_redirect( $url, 301 );
 exit;
 }
 wp_reset_postdata();
 }
 }
} // 多分動くと思う
add_action( 'template_redirect', 'redirect_to_new_permalink' );

kei344 (@kei344)さん

今の感じだと、上記コードをお借りするか、サーバー経由の301リダイレクトしか方法はなさそうです。

301リダイレクト .htaccessで行う方法

.htaccessで行うのがとにかく憂鬱なので、プラグインや上記コードなど効率的な方法を探しましたが、万一トラブルが起きた場合、リカバリーする情報を探し当てる気力がないため、あきらめて無難なこれでやってみます。

とりあえず、こんな感じでいいのだと思う(A)

# リダイレクト処理
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^entry/2019/12/03/002451$ https://blog.hotelsmatome.com/archives/3294 [R=301,L]
RewriteRule ^entry/2019/12/02/203641$ https://blog.hotelsmatome.com/archives/2542 [R=301,L]
RewriteRule ^entry/2019/12/02/190305$ https://blog.hotelsmatome.com/archives/4068 [R=301,L]
RewriteRule ^entry/2019/12/02/172751$ https://blog.hotelsmatome.com/archives/2538 [R=301,L]
</IfModule>

entryが古いURL、archivesからはじまるのが新しいURLです。

これを全記事272記事分記述していきます。でもとりあえず、上記でちゃんとリダイレクトされるかまずは試してみます。

わたしはXserverのFTPツールを使っています。

該当ドメイン > public_html > blog >.htaccess (☆)をダウンロード

ファイルを開いたところ。#BEGIN からはじまっていることを確認。

注意:public_htmlの下にも.htaccess というファイルがありますがこれではありません。

参考:WindowsもMacもドット(.)からはじまるファイルを保存できません。

”BEGIN”の前に先ほどの(A)を追記

追記したら同じ場所にアップロードし、ファイル名を.htaccessに変更(ドットが頭につく)

旧URLにアクセスして正常にリダイレクトされていれば完了です。確認したところきちんとリダイレクトされていました。

あとは追記して同じ作業をすれば作業はおしまいです。

なんのことはない、ただ面倒なことを避けていただけ。

この後にリンクエラー修正をしていきます。現在リンクエラーは562個あります。(すべてが今回のリンクエラーではありませんが)こちらの修正作業のほうが何十倍も大変です。

テストが成功したので実際の.htaccessファイルの作成をしていきます

データを作成

旧リンクと新リンクのリストをスプレットシートで作成し、関数で結合しました。

旧リンクをRewriteRule ^entry〜に置換

新リンクはhttpsを半角スペース+httpsに置換。あとは$と半角スペース+[R=301,L]の列を入れて(=&)でA列から結合。半角スペースに注意

テキストエディタで置換してもいいと思います。

本番ファイル作成 >

本番用の.htaccessファイルに同じ手順で274記事分の記述をコピー&ペーストしてアップロードして完了です。

パスを確認してアップロードしファイル名を.htaccess に変更

うまくいくかな・・・

確認したらちゃんとリダイレクトされていました。

<301リダイレクトはおしまい>