※この記事は2017年8月27日に投稿したブログ記事を移転してきたものです。
Googleなどのウェブマスターツールに登録しておくと、サイトを監視していなくても各種クローラーが監視役をしてくれて便利です。
今回は、そのウェブマスターツールに「ソフト404」で怒られたので原因究明と対処をしました。
ソフト404とは
Googleの定義によると、ページが存在しない(本来ステータスコード404を返すべきな)のに200OKなどが返ってきてしまうことを言うそうです。
200が返ってきているので、通常のインデックス処理などを行ってしまうbotなどもあります。
一方で閲覧者には白紙ページとなっているため、SEOにもユーザーにも良くない状況です。
私のサイトの症状
WordPressで運営しているサイトで、2ページほどエラーが出ていました。
これ以外にもサイトが妙に重くなる症状を併発していたため、原因究明と対応に時間がかかってしまいました。
結果的にソフト404問題だった部分だけを書き出すと、
- 当該ページにアクセスするとステータスコード200または500が返る
- Apacheのアクセスログに残らない場合もある(これはサイトがめちゃくちゃ重かったせいかも)
- ページの読み込みがめちゃくちゃ遅い(結果的に白紙が返る)
- 当該記事の内容は無事。管理画面やAMPページでは問題なく見れる(これが混乱の元)
という症状でした。
原因究明
疑った順番に書きます。結論だけ知りたい方は次節へ。
1. サイトが重いからじゃない?
別問題の一部だと思っていた頃です。
でも、サイトも24時間ずっと重いわけじゃないので、スイスイ動いている時は別ページは普通に見れる。むしろソフト404が出ているページにアクセスすると重くなるような…。
2. MySQLの不具合
素直に考えれば、当該記事のみ本文などが破損していると考えられます。
そこで管理画面からチェック。…普通に見れるし何なら記事の更新作業もできる…。
AMPプラグインによるAMPページも閲覧可能。
念の為データベースも見てみましたが、特に破損は見当たらず。
3. ApacheやPHPの不具合
実は、サイトが重くなったりソフト404が出る前に、色々やっていたのでした。
- Yandexへの登録(クローラーが頻繁に来るようになった)
- システム全体のアップデート&高速化(Apacheのチューニングを含む)
- WordPressのプラグインアップデート
しかし、上2つは症状が出た時期と1週間以上ずれています。
エラーは1日に何度も起こっているので、1週間以上一度もエラー無しで運用出来た後に、突然重くなったりエラーが出たりというのは、これらが原因とは考えにくいです。
プラグインアップデートのみ、サイトが重くなった日と同日でしたが、こちらはプラグインを停止しても重いまま…これも原因ではないようです。
いずれにせよ、一部の記事にのみ影響を及ぼしそうなプラグインではなかったため、除外。
残るはURL構造や純粋なPHPの構文エラーが考えられます。特に、たまたまURLの似ている記事だったので、かなり疑いました。
ところが、よく考えたら他にも同じような、はっきり言って今回見れなくなったページよりももっと似ているURLの記事もあります。リダイレクトなども設定しておらず、実際されている様子もない。
試しにスラッグ変更などもやってみましたが、駄目だったのでこれではない。
PHP構文に至っては、このところテンプレートなどを弄っていなかったのでエラーが起こる要素が見当たらない…。
そもそも、最初のPHP処理が行われる前に表示されるべきHTML部分も表示されないため、何かもっと別の問題な気がしました。
ちなみに、 デバッグモードは使えませんでした。 そもそも重くて読み込めない。
最終的な原因
改めてデータベースをよく見直していたところ、post_statusに見慣れない inherit
という文字が入っていました。
これはattachment、つまりメディアファイルの公開範囲を、紐付けられている投稿(親投稿)に合わせる、というものです。
今回の ソフト404の原因は、このinherit属性が通常の投稿に入っていたから でした。
これをpublishedにし、ブラウザやサーバーのキャッシュを削除してアクセスし直すと無事表示されるようになりました。
何故一部の記事にのみこの属性が入ってしまったのかはわかりません。
当該記事はカスタム投稿タイプでしたが、記事に親子関係は付けていませんでした。
管理画面からだと普通に「公開」状態に見えてしまうので、一部の記事のみソフト404になったり表示が重い、という方はデータベースの中身をチェックしてみてください。