13時49分23秒 [Web関連]
とある企業サイトに関して、「数ヶ月前からGoogleの検索結果に一切ヒットしなくなった」という相談を受けました。
いろいろ調べてみたところ、ウェブサーバにアクセスした際に返されるHTTPレスポンスヘッダが以下のような条件で分岐されていることに気付きました。
なかなか謎の現象でした。
上記のようになっているので、Google Botなどが使っているユーザエージェント名からのアクセスに対しては「410 Gone」が返ります。そのせいで、検索結果からも排除された上で、クローラーのアクセス数も激減していたのでした。
最初は、.htaccessファイルでリダイレクト関連の記述をミスったがための影響かな? と思ったんですが、当該サイトではそもも.htaccessファイルは利用されていませんでした。
結論から言うと、
この現象はレンタルサーバ会社側が科したペナルティでした。
実は、あまりにも負荷の高いウェブサイトだったために、レンタルサーバ側からペナルティを科されて、
……という措置が執られていたことが判明しました。
そんな措置を契約者に知らせることなく実施するレンタルサーバもあるのかと驚きました!
※注:このブログがあるレンタルサーバ会社ではありません。
もちろん共用サーバなのですから、負荷の高すぎるサイトに対して何らかの対処をする必要がありますし、場合によってはペナルティを科すことも当然だとは思います。ただ、せめて「こういうペナルティを科しました」という事後報告くらいあって良いと思うんですが。そうすれば契約者の側だって何らかの対策を考えたり採ったりできるわけですし。
今回は無警告・無報告で実施されてしまったがために、「なんか数ヶ月前から検索結果に一切出なくなったんだけど」→「じゃあ調べましょうか。……なんか410 Goneを返しまくってるんだけど」→「いや、特にそんな設定をした覚えはないが」→「では原因はどこにあるんだろうか」などという試行錯誤を経る無駄な時間を費やしてしまったわけで。
そもそも、HTTPステータスコードには「高負荷でアクセスできないよ」というような意味を表せる、「503 Service Temporarily Unavailable」があるわけで、アクセス元の区別なくそれを返してくれていれば良かったんじゃないかと思うんですけども。(もしかして、ペナルティというか、「せめて人間には見せてやろう」という配慮なんでしょうか?^^;)
当該サイトはPHPからデータベース(MySQL)にアクセスして情報を表示するサイトで、一部のページは非常に重くなっていました。ウェブサーバにリクエストを送ってから最初の反応が返ってくるまでに30秒くらいかかってしまうような。
いろんなところに問題はありそうでしたけども、検索結果から全排除されるような何らかの悪質な要素があるわけでもなさそうなので、検索結果に一切出てこないのはちょっと不思議だなとは思いました。
もうやや忘れかけていますが、だいたい以下のような順序で調べた気がします。
検索結果に出てこなくなった際には、まずは「Google Search Console」を覗いてみるのが良いでしょう。クローラーがどれくらいの頻度で訪れて情報を引っ張っているか、何らかのエラーが発生していないか、SEO関連でペナルティを科されていないか、などの情報が得られます。
で、実際にそのサイトの「Google Search Console」で「クロールの統計情報」を見ると、数ヶ月前のある時点から突然クローラーがほとんど来なくなっている事実が判明しました。
1ヶ月にわずか1~2回しかクロールされておらす、しかも1回のクロールで最大2ページしか読んでいません。比較のために私のサイトの情報も調べると、毎日平均629ページがクロールされていました。というわけで、検索結果にヒットしないのは「そもそもクロールされていないから」ということが分かりました。そりゃ情報を取得しに来てくれなかったら、検索結果に出るわけがありませんよね。
最初は、そのように「あまりにも反応が遅い」ために、検索エンジンのクローラーがアクセスを諦めてしまっているのかな? と思ったんですが……、
Google Search Console内にある「Fetch As Google」機能を使うと、Google Botがどのようにウェブページを見ているか(描画しているか)が分かります。
実際に試してみると、ステータスには「見つかりませんでした」というエラーが表示されます。正常な場合には、この欄には「完了」という緑色の文字が出ます。
※このFetch As Googleでレンダリングリクエストも送っていれば、「完了」の項目をクリックすることで実際の描画結果が画像で見えます。しかし「見つかりませんでした」エラーが出る場合には描画結果も参照できませんでした。
IE、Edge、Firefox、Chromeなどのブラウザで閲覧すれば問題なく見えるのに、「Fetch As Google」では見つからないと言われてしまうので、クローラーにどう見えているのかが判断できません。
ちょっと困りました。
Google Botがどのように見ているのかを直接調べるために、Google Botを装ってウェブサイトにアクセスしてみることにしました。
具体的には、Windows上のChromeのデベロッパーツールを使って、ブラウザのUA(ユーザエージェント)名をGoogle Botが使っている名称「Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)」に変更してアクセスします。
すると、状況が見えてきました。
Google Botを装ってアクセスすると、以下のように「410 Gone」というエラーが返っていました。
というわけで、どうやらGoogle Botがウェブサイトにアクセスしようとしても、Google Botにはコンテンツの存在が見えていないようだということが分かりました。なかなか問題は深刻そうです。これならクロール頻度が激減するのも納得です。HTTPステータスコード410とは「もうこのURLにコンテンツは存在しません(消滅しました)」という意味ですから。「404 Not Found」の場合だと「何らかのミスで消えた」とか「一時的に消されてしまっただけ」という可能性もありますが、「410 Gone」をわざわざ返すということは、「運営者の意思で消した」のだろうと推測できますから。
ページがPHPで出力されていたウェブサイトでしたし、ユーザエージェント名をチェックしてPCとモバイルを分岐しているサイトでもあったので、まずはPHPソースの記述を疑いました。
でも、「モバイルなら移動、それ以外ならそのまま」という分岐処理だったので、Google Botにだけ410 Goneを返してしまう原因はなさそうでした。
さらに、よくよく確認してみると、以下の事実が分かりました。
この、存在しないURLにアクセスした場合でも「410 Gone」が返されるという事実から、PHPソースの問題ではなく、ウェブサーバの設定の問題だと言えそうです。
また、Google Botを決め打ちしているわけではなく、「PCやモバイルで使われる一般的なブラウザ以外」全部に対して「410 Gone」を返していそうなことも分かりました。
いろいろ調べてみたところ、リダイレクトの記述を誤ると「410 Gone」が返ってしまうケースがあることが分かりました。
普通、リクエストを別ページに転送(リダイレクト)する際には、HTTPステータスコードに301や302などを返します。(307や308なども使われますが。)
しかし、リダイレクトする記述を使いながら、リダイレクト先の記述を省略してしまうと、「移動先がない(消滅した)」という解釈で「410 Gone」が返されるようです。
さて、ウェブサーバはApacheでしたので、HTTPステータスコードをどうにかするには .htaccessファイルを使います。
どこかにそういう誤った記述が含まれる .htaccessファイルがあるだろう……と予想したのですが、見つかりません。
そもそも、このウェブサイトでは.htaccessファイルが1つも使われていませんでした。
しかし、何らかの手段で「一般のブラウザ」と「それ以外」とを判別して分岐していることは間違いありません。
ウェブサーバのアクセスログを見てみると、410を返しているケースが多数ありました。Google Botはもちろん、Bing Botに対しても410を返しています。
このような事実からも、必ずどこかに「強制的に410を返す」ような設定があるはずです。
でも、レンタルサーバのコントロールパネルを見てみても、それらしき設定項目は見つかりません。
ここまで来ると、途方に暮れてしまいました。(^_^;;;
で、こうなると「もはやレンタルサーバ会社のサポートに問い合わせるしかないのでは」というアドバイスをする以外に方法が残っていません。
ということで問い合わせて頂いた結果、
という返答があり、すべての原因はレンタルサーバ会社側の対処(ペナルティ)だと判明したのでした。
……たしかに重たいサイトでしたから、ペナルティが必要なのは分からんもでないんですが、その事実をちゃんと報告していればこんな苦労をする必要もなかったのに……と思わずに居られません。^^;
まあ、もしかしたらちゃんと報告はあったものの、先方の担当者が黙殺したか意味を理解できなかったか何かそういうことだったのかも知れませんけども。
※ちなみに、先方が契約しているのは、そのレンタルサーバ会社が提供している最上位のコースだったので、契約を上位に変更するという対策は取れませんでした。(格安レンタルサーバではなく、そこそこ月額料金の高いレンタルサーバです。)
確かに、とても重たいサイトでした。
PHPを使ってデータベース(MySQL)からデータを引っ張ってくるのにものすごく時間がかかっていたんですよね。それ以外の部分でも、画像サイズが無駄に大きかったり、必要性の低いスクリプトを読んでいたり、いろいろ問題点は見つかりました。
一応、若干の軽量化対策とかを施しましたが、本格的に負荷を減らすには、データベース側に負荷軽減策が必要です。
幸いなことに、毎回データベースを参照する必要のあるリクエストというのは多そうではないようだったので、「データベースからの読み込み結果を一定期間キャッシュしておく」とかの対処を使えば、ある程度は軽減できそうな感じでした。
まあそれはともかくとして、「負荷の高すぎるサイトに強制的に『410 Gone』を返すことでクローラーのアクセスを阻害してアクセス数(負荷)を減らそうとする方針のレンタルサーバ会社があるとは思わなかったので驚いた」という話でした。^^;
ウェブサイトが重たくなってしまっている場合には気をつけましょう。
もっとも、ウェブサイトが重たいのであれば、ペナルティとか検索結果云々以前に、人間の閲覧者だって帰ってしまうでしょうから対処は必須ですが。
※注:この問題のサイトが契約しているレンタルサーバ会社は、私は使ったことがない会社でした。(つまり、このブログがあるサーバではありませんので、混同・誤解しないようご注意下さい。)
この日記へのコメントはお気軽に! コメント数:2件
(前の記事) « CSSだけでドロップダウンメニューのサブメニューを開閉する方法
前後のエントリ
< 旧 / 新 >
(次の記事) 「スタートアップツール for ATOK」を削除すると[CTRL]キー2回で辞書引きできるイミクル機能も無効になってしまう »
サーバ会社名を書こうかどうしようか迷ったんですけどもね。そのサーバ会社の方針が将来に渡ってずっとそうかどうかは分からないので、まあ避けておきました。別に隠したいわけではないので、個別に問われれば答えても良いとは思うんですが。(^_^;)
投稿者 にしし : 2018年09月27日 23:13
コメント数: 2件
どこのサーバーで、どれぐらいのアクセスと負荷がかかっていたのか興味があるところです。
投稿者 Anonymous : 2018年07月02日 21:44