にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2017/05/11. 12:14:35.

レンタルサーバのペナルティで強制的に「410 Gone」が返される事例に驚いた

410 Goneとある企業サイトに関して、「数ヶ月前からGoogleの検索結果に一切ヒットしなくなった」という相談を受けました。
いろいろ調べてみたところ、ウェブサーバにアクセスした際に返されるHTTPレスポンスヘッダが以下のような条件で分岐されていることに気付きました。

  • PCやモバイル端末で使われる一般的なブラウザのユーザエージェント名でアクセスすると、HTTPステータスコードには「200 OK」が返されていて普通に閲覧できる。
  • それ以外のユーザエージェント名でアクセスすると、HTTPステータスコードには「410 Gone」が返されて、一切閲覧できない

なかなか謎の現象でした。
上記のようになっているので、Google Botなどが使っているユーザエージェント名からのアクセスに対しては「410 Gone」が返ります。そのせいで、検索結果からも排除された上で、クローラーのアクセス数も激減していたのでした。
最初は、.htaccessファイルでリダイレクト関連の記述をミスったがための影響かな? と思ったんですが、当該サイトではそもも.htaccessファイルは利用されていませんでした。

結論から言うと、

負荷の高すぎるサイトに対するペナルティだった

この現象はレンタルサーバ会社側が科したペナルティでした。
実は、あまりにも負荷の高いウェブサイトだったために、レンタルサーバ側からペナルティを科されて、

  • 人間以外のUAには強制的に『410 Gone』を返す

……という措置が執られていたことが判明しました。
そんな措置を契約者に知らせることなく実施するレンタルサーバもあるのかと驚きました!

※注:このブログがあるレンタルサーバ会社ではありません

もちろん共用サーバなのですから、負荷の高すぎるサイトに対して何らかの対処をする必要がありますし、場合によってはペナルティを科すことも当然だとは思います。ただ、せめて「こういうペナルティを科しました」という事後報告くらいあって良いと思うんですが。そうすれば契約者の側だって何らかの対策を考えたり採ったりできるわけですし。
今回は無警告・無報告で実施されてしまったがために、「なんか数ヶ月前から検索結果に一切出なくなったんだけど」→「じゃあ調べましょうか。……なんか410 Goneを返しまくってるんだけど」→「いや、特にそんな設定をした覚えはないが」→「では原因はどこにあるんだろうか」などという試行錯誤を経る無駄な時間を費やしてしまったわけで。

そもそも、HTTPステータスコードには「高負荷でアクセスできないよ」というような意味を表せる、「503 Service Temporarily Unavailable」があるわけで、アクセス元の区別なくそれを返してくれていれば良かったんじゃないかと思うんですけども。(もしかして、ペナルティというか、「せめて人間には見せてやろう」という配慮なんでしょうか?^^;)

強制的に「410 Gone」が返される現象の原因を探ろうと試行錯誤した記録(^_^;)

当該サイトはPHPからデータベース(MySQL)にアクセスして情報を表示するサイトで、一部のページは非常に重くなっていました。ウェブサーバにリクエストを送ってから最初の反応が返ってくるまでに30秒くらいかかってしまうような。
いろんなところに問題はありそうでしたけども、検索結果から全排除されるような何らかの悪質な要素があるわけでもなさそうなので、検索結果に一切出てこないのはちょっと不思議だなとは思いました。
もうやや忘れかけていますが、だいたい以下のような順序で調べた気がします。

1. Google Search Consoleでちゃんとクロールされているかどうかを調べる

検索結果に出てこなくなった際には、まずは「Google Search Console」を覗いてみるのが良いでしょう。クローラーがどれくらいの頻度で訪れて情報を引っ張っているか、何らかのエラーが発生していないか、SEO関連でペナルティを科されていないか、などの情報が得られます。
で、実際にそのサイトの「Google Search Console」で「クロールの統計情報」を見ると、数ヶ月前のある時点から突然クローラーがほとんど来なくなっている事実が判明しました。

Google Search Consoleで調べたクロールの統計情報(少ない) Google Search Consoleで調べたクロールの統計情報(普通)

1ヶ月にわずか1~2回しかクロールされておらす、しかも1回のクロールで最大2ページしか読んでいません。比較のために私のサイトの情報も調べると、毎日平均629ページがクロールされていました。というわけで、検索結果にヒットしないのは「そもそもクロールされていないから」ということが分かりました。そりゃ情報を取得しに来てくれなかったら、検索結果に出るわけがありませんよね。
最初は、そのように「あまりにも反応が遅い」ために、検索エンジンのクローラーがアクセスを諦めてしまっているのかな? と思ったんですが……、

2. Fetch As GoogleでGoogle Botがどのように見ているかを調べる

Google Search Console内にある「Fetch As Google」機能を使うと、Google Botがどのようにウェブページを見ているか(描画しているか)が分かります。
実際に試してみると、ステータスには「見つかりませんでした」というエラーが表示されます。正常な場合には、この欄には「完了」という緑色の文字が出ます。

Fetch As Googleのステータスが「見つかりませんでした」エラーになる

※このFetch As Googleでレンダリングリクエストも送っていれば、「完了」の項目をクリックすることで実際の描画結果が画像で見えます。しかし「見つかりませんでした」エラーが出る場合には描画結果も参照できませんでした。

IE、Edge、Firefox、Chromeなどのブラウザで閲覧すれば問題なく見えるのに、「Fetch As Google」では見つからないと言われてしまうので、クローラーにどう見えているのかが判断できません。
ちょっと困りました。

3. ユーザエージェント名を変更して、Google Botのようにアクセスして調べる

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を装ってアクセスすると410 Goneが返る

というわけで、どうやらGoogle Botがウェブサイトにアクセスしようとしても、Google Botにはコンテンツの存在が見えていないようだということが分かりました。なかなか問題は深刻そうです。これならクロール頻度が激減するのも納得です。HTTPステータスコード410とは「もうこのURLにコンテンツは存在しません(消滅しました)」という意味ですから。「404 Not Found」の場合だと「何らかのミスで消えた」とか「一時的に消されてしまっただけ」という可能性もありますが、「410 Gone」をわざわざ返すということは、「運営者の意思で消した」のだろうと推測できますから。

ページがPHPで出力されていたウェブサイトでしたし、ユーザエージェント名をチェックしてPCとモバイルを分岐しているサイトでもあったので、まずはPHPソースの記述を疑いました。
でも、「モバイルなら移動、それ以外ならそのまま」という分岐処理だったので、Google Botにだけ410 Goneを返してしまう原因はなさそうでした。
さらに、よくよく確認してみると、以下の事実が分かりました。

  • 存在しないURLを指定した場合でも、人間用ブラウザには「404 Not Found」が返るのに、Google Botには「410 Gone」を返している。
  • ユーザエージェント名を「ABC123XYZ」のような適当な文字列にした場合でも、常時「410 Gone」が返される。

この、存在しないURLにアクセスした場合でも「410 Gone」が返されるという事実から、PHPソースの問題ではなく、ウェブサーバの設定の問題だと言えそうです。
また、Google Botを決め打ちしているわけではなく、「PCやモバイルで使われる一般的なブラウザ以外」全部に対して「410 Gone」を返していそうなことも分かりました。

4. ウェブサーバの設定を調べる

いろいろ調べてみたところ、リダイレクトの記述を誤ると「410 Gone」が返ってしまうケースがあることが分かりました。
普通、リクエストを別ページに転送(リダイレクト)する際には、HTTPステータスコードに301や302などを返します。(307や308なども使われますが。)
しかし、リダイレクトする記述を使いながら、リダイレクト先の記述を省略してしまうと、「移動先がない(消滅した)」という解釈で「410 Gone」が返されるようです。

さて、ウェブサーバはApacheでしたので、HTTPステータスコードをどうにかするには .htaccessファイルを使います。
どこかにそういう誤った記述が含まれる .htaccessファイルがあるだろう……と予想したのですが、見つかりません。
そもそも、このウェブサイトでは.htaccessファイルが1つも使われていませんでした。

しかし、何らかの手段で「一般のブラウザ」と「それ以外」とを判別して分岐していることは間違いありません。
ウェブサーバのアクセスログを見てみると、410を返しているケースが多数ありました。Google Botはもちろん、Bing Botに対しても410を返しています。

このような事実からも、必ずどこかに「強制的に410を返す」ような設定があるはずです。
でも、レンタルサーバのコントロールパネルを見てみても、それらしき設定項目は見つかりません。
ここまで来ると、途方に暮れてしまいました。(^_^;;;

5. レンタルサーバのサポートに問い合わせて、ペナルティの事実が発覚!

で、こうなると「もはやレンタルサーバ会社のサポートに問い合わせるしかないのでは」というアドバイスをする以外に方法が残っていません。
ということで問い合わせて頂いた結果、

  • 共用サーバなので、負荷が高すぎるサイトには、一般的なブラウザ以外に対して強制的に410を返すペナルティを科している
  • 何らかの対策が採られたら解除することは可能。

という返答があり、すべての原因はレンタルサーバ会社側の対処(ペナルティ)だと判明したのでした。
……たしかに重たいサイトでしたから、ペナルティが必要なのは分からんもでないんですが、その事実をちゃんと報告していればこんな苦労をする必要もなかったのに……と思わずに居られません。^^;
まあ、もしかしたらちゃんと報告はあったものの、先方の担当者が黙殺したか意味を理解できなかったか何かそういうことだったのかも知れませんけども。

※ちなみに、先方が契約しているのは、そのレンタルサーバ会社が提供している最上位のコースだったので、契約を上位に変更するという対策は取れませんでした。(格安レンタルサーバではなく、そこそこ月額料金の高いレンタルサーバです。)

レンタルサーバ会社側が「410 Gone」を返すよう設定するケースもあるのだと……

確かに、とても重たいサイトでした。
PHPを使ってデータベース(MySQL)からデータを引っ張ってくるのにものすごく時間がかかっていたんですよね。それ以外の部分でも、画像サイズが無駄に大きかったり、必要性の低いスクリプトを読んでいたり、いろいろ問題点は見つかりました。
一応、若干の軽量化対策とかを施しましたが、本格的に負荷を減らすには、データベース側に負荷軽減策が必要です。
幸いなことに、毎回データベースを参照する必要のあるリクエストというのは多そうではないようだったので、「データベースからの読み込み結果を一定期間キャッシュしておく」とかの対処を使えば、ある程度は軽減できそうな感じでした。

まあそれはともかくとして、「負荷の高すぎるサイトに強制的に『410 Gone』を返すことでクローラーのアクセスを阻害してアクセス数(負荷)を減らそうとする方針のレンタルサーバ会社があるとは思わなかったので驚いた」という話でした。^^;
ウェブサイトが重たくなってしまっている場合には気をつけましょう。
もっとも、ウェブサイトが重たいのであれば、ペナルティとか検索結果云々以前に、人間の閲覧者だって帰ってしまうでしょうから対処は必須ですが。

注:ここのサーバの話ではありません

※注:この問題のサイトが契約しているレンタルサーバ会社は、私は使ったことがない会社でした。(つまり、このブログがあるサーバではありませんので、混同・誤解しないようご注意下さい。)

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。






※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※ご投稿頂いた内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

著者紹介


にしし(西村文宏)

にししでございます。本書いたり記事書いたりしてます。あと萌えたり。著書5冊発売中です(Web製作系4冊+小説1冊)。著書や記事は「西村文宏」名義。記事は主にAll Aboutで連載。本の最新刊は2011年3月に発売されたライトノベルでございますよ。

Twitter:にしし/西村文宏
にしし/西村文宏 on facebook にしし/西村文宏 on mixi にしし/西村文宏 on Google+ フォローはお気軽に!

にしし(西村文宏)連絡先
☕ コーヒーをおごる

著書一覧と詳細

関連する記事など

※下記には、本サイト内外の関連記事などが8本くらい自動で表示されています。

このブログ内限定での主要なカテゴリ

track word

--- 当サイト内を検索 ---