トップページだけインデックス登録されない時は.htaccessを疑え

WordPressで運用しているブログで、開始から1か月経ってもインデックス登録されず、Google検索にかからない問題に悩まされていた。

あらゆる対策を打っても解決せずお手上げだったところ、サーバの上位ディレクトリに「.htaccess」ファイルがあるのに気がついた。この中に、「index.htmlを参照せよ」という記述があり、WordPressの生成するindex.phpと競合していたのが原因だった。

こんな間抜けな理由ではまる人は少ないと思うが、今後のために記録を残しておこう。

ブログ開始時から出ていたトラブルの兆候

ウェブサイトを開設してから「トップページがインデックスされていない」という状況に気づくまでに、いくか怪しい兆候が出ていた。

①ログイン画面でリダイレクトループに陥る

WordPressをセットアップした際、「wp-login.php」のページでアカウントとパスワードを正しく入力しても、なぜか管理画面に遷移せず、リダイレクトループになってエラー画面が表示される現象があった。

WordPressをサブディレクトリに入れたので、そのあたりが原因かと思ったが、とりあえずログイン後に直接URLを叩けば管理画面に入れたので、放置してあった。

②AdSenseの審査にどうやっても受からない

1か月ほど記事を書きためてGoogle AdSenseに審査を申し込んだが、「不十分なコンテンツ」として落とされた。その後、拒絶の理由を推測しながら様々な対策を施したが、一向に受からず、結局別サイトで申請したらあっさり受かった。

今となっては検証できないが、AdSenseに受からなかったのはコンテンツの中身が問題だったのではなく、単にGoogleのクローラーがトップページにたどり着けなかっただけかもしれない。

③AdSense広告を配置してもデータ集計されない

ようやく取得できたAdSenseアカウントを使って広告ユニットを生成し、ウェブサイトに配置してみた。問題なく広告は表示されているのだが、AdSenseのパフォーマンスレポートを詳しく見ると、このサイトの広告だけ、いつまでたっても「該当期間のデータはありません」と表示されている。

ほかのサイトに配置した広告からは、わずからながら表示回数やクリック数のデータは上がってきているのに、画面上は広告が出ているにも関わらずAdSenseにカウントされていないのはおかしいと気づいた。

④AdWordsでも広告が不承認

キーワードプランナーを使ってみたくてGoogle AdWordsに登録しようとしたところ、実際に予算を決めて広告キャンペーンを打たないと先に進めない仕様になっていた。仕方なく月10円とかの超低予算で広告を出稿してみたが、しばらくして見るとステータスが「不承認」になっていた。

「無効なHTTP応答コード」というエラーが出ていたので、広告内の文言やサイトの内容がGoogleのポリシーに違反しているとか、そういうことはなさそうだ。

⑤Search Consoleでクロールエラー

GoogleのSearch Consoleに管理しているサイトをいくつか登録してみたが、問題のサイトだけ、いつまで経ってもダッシュボードにスクリーンショットが表示されなかった。詳しく調べると、「URLエラー 1アクセスが拒否されました」というクロールエラーが出ていた。

一般的なインデックス対策は効果がなかった

状況を整理すると、以下の2点が問題だとわかった。

  1. サイト全体でなく、トップページだけインデックスされない
  2. ブラウザ上では正しく表示されているのに、クローラーが巡回できない

何かわざとGoogleのクローラー対策を施しているような状態で、ペナルティーを受けるのもこわい。

一応、書籍やネットで調べて、一般的な「ウェブサイトがインデックスされないときの対策」として、次のようなものはすべて試した。しかし結果的にはまったく効果がなかった。

①WordPressの設定確認

ありがちだが、WordPressの設定>表示設定で「検索エンジンがサイトをインデックスしないようにする」にチェックがついていないかはまず確かめた。また、生成されたindex.phpにnoindexのメタタグがついていないのも確認した。これらは原因でない。

②robots.txtをSearch Consoleから送信

robots.txtはWordPressですでに自動生成されているもので問題なさそうだった。念のため、disallowをすべて外したダミーのrobots.txtをつくってサーバにアップし、そちらが優先的に参照されるようにした。

③sitemap.xmlをSearch Consoleから送信

WordPressにXML Sitemap Generatorというプラグインを入れてsitemap.xmlを生成し、robots.txtに追記するとともにSearch Consoleから送信した。「送信いただいたURL」は40個くらい出たが、いずれもインデックス登録されなかった。

④Fetch as Googleでインデックスに送信

Search Console内のFetch as GoogleにサイトのURLを入れると、ステータスが「エラー」と出るだけで、詳細情報は得られなかった。また、トップページのindex.phpまで指定してみると、「リダイレクトされました」の表示が出た。

ここで、サイト内の個別記事のURLを入れると、問題なく取得・レンダリングが完了して、インデックス送信もできた。しばらくすると、送信した個別記事だけはGoogleでかかるようになった。しかしsite:○○やinfo:○○でサイトのURLを入れても、トップページは出てこなかった。

⑤WordPressやテーマ設定をデフォルトに戻す

クローラが内部リンクをたどれないのが原因かと推測して、デザイン上、カスタム設定で非表示にしたり、cssでdisplay:none;に設定していた項目を復活させた。なるべくWordPressとテーマのデフォルトに近い状態に戻した。

⑥レンタルサーバのIP制限がないのを確認

サイトを設置してあるサーバの方で、IPアドレスをもとに海外からのアクセスを弾く設定がされていないか調べた。

さくらインターネットでは「国外IPアドレスフィルタ」の設定があるらしいが、自分が借りているXREAでは、そのような制約はなさそうだった。今までも海外の旅先から自分のサイトはちゃんと見えていた。

上位階層の.htaccessが原因と判明

原因不明だが、GoogleからアカウントもしくはIPアドレスに対して全体的なペナルティを課されているのだろうか。こうなったら別のサイトやアカウントを作ってやり直すしかないかとか考えたが、トップページ以外はインデックスされるのも不思議だ。

Search Consoleの「クロールエラー」を見ると、「エラーのあるページ」のレスポンスコードが403と出ていた。HTTP 403 Forbideen、すなわちそのページがクローラーに対しては閲覧禁止されていて、何らかの認証制限がかかっているということだ。

ここでようやく.htaccessの存在を思い出した。


WordPressを入れているディレクトリには.htaccessファイルがなかったので、これは原因でないと考えていた。

しかしあらためて調べると、上位階層にばっちり.htaccessが設置してあった。しかもその中に「DirectoryIndex index.html」という記述があり、これがWordPressの生成するindex.phpとバッティングしてリダイレクトループが発生していたらしい。

上位のディレクトリに手を加えたのは10年くらい前だ。おそらくその際、index.htmlとindex.phpを併存させたり、何かデバッグ作業していたのだろう。これを外すと、あっさりFecth as Googleのリクエストも通り、トップページをインデックスに送信できた。しばらくするとGoogleの検索にもかかるようになった。

同様のトラブルで悩んでいる人は、サーバー内のどこかに変な記述をした.htaccessファイルがないか、探してみるとよいだろう。