
DevelopersIOブログ記事の Googleインデックス数が半減した事象について(2025年2月19日〜26日)
2025年2月19日から2月26日にかけて、当ブログ(Developers.io)の Google登録のインデックス数が半減、Google検索で当ブログの記事がヒットしにくくなる事象が発生していました。
この件で実施した調査と対応内容について共有します。
時系列
Google Search Console ページのインデックス登録数が、2/19〜25日にかけて減少していました。
- 2月18日
- インデックス登録数 6.3万件
- 2月19日
- インデックス登録数 5.7万件
- 2月23日
- インデックス登録数 3.7万件
- 2月26日
- インデックス登録数 6.3万件
- 登録数のグラフ
対処
2月25日
- 新規投稿記事がGoogle検索でヒットしない旨の社内問い合わせと、2/24(祝)にGoogleサーチコンソールから送付されていた ソフト404発生のメール通知を受けて調査に着手
- Google Search Console を利用して、2/22 までのインデックス登録情報のレポートを確認。
- 2/19〜2/22 の4日間、ソフト404エラーが記録され、2/22時点の発生数は 5597件。
- インデックス登録数が、ソフト404発生数とほぼ同数減少。
- ソフト404発生した記事URLを対象に、Google Search Console の URL検査を実施、
- スクリーンショットでクライアントエラー発生
- JavaScriptコンソールメッセージでエラーを確認。
-
記事ページのSSRに利用している フロントアプリ(NextJS) の切り戻しを実施
- 2/18リリース版を一つ前のバージョンに変更
-
切り戻し後、サーチコンソールのURL検査が正常完了することを確認。
- サーチコンソール上で「修正を検証」を実施して、インデックス再登録を手配
- 新規公開記事、Google検索でヒットする事を確認
2月25日
- 2/19 リリースの修正版をリリース
3月3日
- Google Search Console のインデックス登録グラフにて、2月26日にインデックス登録数が6.3万件に回復した事より、復旧完了を確認。
原因
ブラウザ側で実行されるJavascriptでの タイムゾーン処理で、GoogleBotで問題が生じるコードが含まれていました。
「@date-fns/tz」を利用した箇所で、Googleのクローラなど一部の実行環境で例外が発生していました。
- 再現コード
import { TZDate } from "@date-fns/tz";
function convertToJST(dateString) {
try {
const jstDate = new TZDate(new Date(dateString)).withTimeZone("Asia/Tokyo");
return jstDate;
}
}
例外が発生した場合、タイムゾーン処理を省略する指定を追加した事で、GoogleBotのエラーは回避できるようになりました。
function convertToJST(dateString) {
try {
const jstDate = new TZDate(new Date(dateString)).withTimeZone("Asia/Tokyo");
return jstDate;
} catch (error) {
return new Date(dateString);
}
}
GoogleBotで問題が発生したリリースでは、当ブログのサイドバナーのイベント情報に時刻情報を扱う処理が追加されていました。
サイドバナーは画面幅に合わせて表示有無を切り替えるため、ブラウザ上で動く実装となっています。
タイムゾーンを考慮した日時処理に 2024年秋にサポートされた date-fnsのv4.0を採用した際の例外不足が重なり、GoogleBotの動作不良を招く事になりました。
-
@date-fns/tz 採用バージョン
- v1.2.0 - 2024-10-31
-
クライアントエラーが発生していたChromeBotのUserAgent
- Chrome 133 :安定版リリース日: 2025 年 2 月 4 日
- UserAgent:
Mozilla/5.0%20(Linux;%20Android%206.0.1;%20Nexus%205X%20Build/MMB29P)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/133.0.6943.53%20Mobile%20Safari/537.36%20(compatible;%20Google-InspectionTool/1.0)
- 参考リンク
恒久対策
当サイトは、フレームワークとしてNext.jsを採用し、記事本文の主要な要素はサーバーサイドレンダリング(SSR)で提供することで、SEOと初期表示速度の最適化を図っています。一方、モバイル最適化や関連記事への動的な導線機能については、クライアントサイドで動作するJavaScriptを活用し、ユーザー体験の向上を目指しています。
今回の事象を踏まえ、クライアントサイドJavaScriptの品質向上に重点を置くとともに、予期せぬエラー発生時にも適切な例外処理を行うことで、致命的なエラーの発生を未然に防ぎます。
Custom Search API
性能傾向の把握を目的とし、トップページや主要記事ページに対して、毎時または日次でSyntheticテスト(合成テスト)を実施していますが、今回のGooglebotで発生したクライアントエラーについては検出できませんでした。
- Amazon CloudWatch Synthetics (syn-nodejs-puppeteer)
- Datadog Synthetic Monitoring & Testing
- Cloudflare Observatory (リリース前、ステージング環境の性能チェック)
Google Search Consoleの管理者宛に、インデックス登録不備の通知メールは届きましたが、ソフト404エラー発生から5日後であり、ダッシュボードのグラフ表示にも3日前後のタイムラグがありました。
APIでGoogle検索を実行できるCustom Search JSON APIを活用し、新規登録記事や主要記事のインデックス状況を定期的に確認し、異常発生時に迅速に通知する仕組みを整備予定です。
生成AI
2/19リリースの時刻処理の変更、コードの差分を、生成AIの Gemini(2.0 Flash)に確認を求めた所、以下のような提案が得られました。
コード品質を担保する手段として、生成AIの活用も検討してきたいと思います。
エラーハンドリングの修正:
catch ブロックでエラーが発生した場合、エラーログを出力し、null や undefined を返すように修正します。
日付文字列のフォーマットの指定:
ISO 8601形式など、明確な形式で日付文字列を受け取るようにし、必要に応じてパース処理を追加することで、日付文字列のパースの脆弱性を軽減できます。
型チェックの追加:
dateString が undefined や null である場合をチェックし、適切なエラーハンドリングを行うことで、予期せぬエラーを防止できます。
関数の説明とドキュメントの追加:
関数の説明、引数、戻り値、使用例などをコメントやドキュメントツールで記述し、関数の意図と使い方を明確にします。
TZDate の有効性チェック:
TZDate のインスタンスが有効な日付を表しているかをチェックし、無効な場合はエラーハンドリングを行うとより堅牢になります。