【SEO】スパムリンク「/1000」で生じた重複ページの処理方法
筆者の運営する「MY就活ネット」にて、スパムリンクにより「スラッシュ区切りのパラメータ」「?から始まるパラメータ」のついた大量の重複コンテンツが発生し、その対処に追われている無料記事です。
ちなみに弊サイトはwordpress等ではなく、テキストエディタ(Notepad++)で作成した手作りサイトです。
具体的な問題
正規URL「https://~~/myskc.php」に対し「https://~~/myskc.php/1000」という、末尾に「/1000」を付与されたスパムリンクが大量に張られ、phpファイルがそれをパラメータと誤認、相対パスがスラッシュ以前をディレクトリと誤認することにより、以下の画像のような「画像・CSSを読み込まず内部リンクがすべて間違った重複コンテンツ」が大量発生しました。
間違ったページでは、相対パスがすべて「/myskc.php/imgs/sub-css.css」といった具合に「myskc.php/」を挟んでしまい、一切の画像・CSSを読み込みません。また、本来「/index.php」「/ad.php」であるはずの内部リンクもすべて「/myskc.php/index.php」「/myskc.php/ad.php」に変化し、それらをクリックすると「/myskc.phpの間違ったバージョン」に飛びます。
これにより内部リンクの数だけ「同様の間違ったページ」が量産され、「/1000」のリンクスパムを複数のページに張られていたことから、16500件もの重複コンテンツをGoogleが認識してしまいました。
ただの重複状態ならまだしも、そのうち1万件が「インデックス未登録(おそらく低品質コンテンツ扱い)」、1000件があろうことか「インデックス登録済み(検索結果に表示される)」に振り分けられてしまいました。
要するに、ユーザー体験を著しく損なう「ダメ記事」が少なくとも11000件あるという状態に陥ってしまったのです。スパムとGoogleしかアクセスしないURLなのに。
「重複コンテンツを気にする必要はない」とGoogle公式見解にありますが、無視するべきではない理由について次の関連記事で解説しています。
これを解決するhtaccessの記述
(24/07/11編集)
間違ったページすべて、.htaccessで削除(410 Gone)のステータスコードを返すことにしました。
RewriteEngine On
RewriteCond %{REQUEST_URI} \.php/$
RewriteRule ^(.*\.php)/$ /$1 [R=301,L]
RewriteCond %{REQUEST_URI} (.*\.php)/.*$
RewriteRule ^ - [R=410,L]
本来は1,4,5行目だけでよいのですが、弊サイトは"xxxx.php/"の外部リンクを一部いただいているため「.php/」で終わる場合のみ正規ページへのリダイレクト処理をしています。
404ではなく410を返すことにしたのは、「見つからない」ではなく「削除した」にすることで若干Googleの処理が早くなると言われているためです。
また、301リダイレクトをやめたのは次の理由です。
301はペナルティも引き継いでしまう
今回の重複コンテンツから引き継ぎたい評価がない
重複→低品質に移動する事象が見られるため、「同一でないページにリダイレクトをしている」ことでスパム判定をもらう可能性を避ける
クロールバジェット節約のため(リダイレクト先をクロールしてしまう)
削除のコードの作成にあたっては、下記ページのコメント欄を参考にしました。
旧版:リダイレクトする場合の記述
間違ったページをすべて、.htaccessで301リダイレクトする場合は下記記述になります。
RewriteEngine On
RewriteRule ^(.*\.php)/.*$ /$1? [R=301,L]
RewriteCond %{REQUEST_URI} !処理を除外するファイル名\.php
RewriteCond %{QUERY_STRING} .
RewriteRule ^(.*)$ /$1? [R=301,L]
2行目で「スラッシュ区切りのパラメータ」の一切を元のファイルにリダイレクト(myskc.phpの後ろにスラッシュがついた時点ですべてmyskc.phpに転送)
5行目で「?から始まるパラメータ」の一切を元のファイルにリダイレクト(myskc.php/1000?utm_sourse=~~のようなURLをすべてmyskc.phpに転送)
ただし、弊サイトには一部に「?id=1_index」のようなパラメータ付きURLを使用していることから、3行目で「5行目の処理をしないファイル」を例外設定しています。
この処理を開始してから約1ヶ月で、以下の成果が上がっています。
検索結果から「ダメ記事」をほぼ排除
約1600ページの「ダメ記事」のリダイレクトをGoogleが認識
また、これらの処理を実施したことをGoogleに伝えるため、「ダメページだけのサイトマップ」を作成・送信するという手法を取っています。それについては次の関連記事をご覧ください。
カノニカルは無視される場合がある
リダイレクト設定に至る以前に「rel=canonical」を設定したのですが、Googleがこれを無視して「ダメ記事」をインデックスし続ける動きを見せました。
いろいろ調べた結果「<head>内の記述順」により「Googleがカノニカルタグにたどり着く前に別の処理をしてしまう」ことがわかりました。リダイレクトのほうが確実なので、上記の設定に至りました。
考察
今回の事象から得られた知見は次の通りです。
逆SEOは未だ有効
被害に対する処理をGoogleが認識するまで何ヶ月もかかる
重複コンテンツが「インデックス未登録」「登録済み」に移動する場合がある
画像とCSS一切なし、内部リンクすべて間違いな上に内容が重複している「ダメ記事」も「有益」と判断される場合がある
「ダメ記事」が大量インデックスされている以上、逆SEOの効果は間違いなくあるでしょう。そして何より驚いたのは、そんなダメ記事でも上位表示される場合があるということです。私の書く文章がよっぽど優れていたのでしょうか。
教訓
今回の事象から得られた教訓は次の3点です。
カノニカルタグは<head>内の最上部に記述する
「?から始まるパラメータ」はリダイレクト、「スラッシュ区切りのパラメータ」は404/410を返すよう設定しておく
重複コンテンツを無視するべきではない
「重複コンテンツはSEOに影響しない」という説も提唱されていますが、弊サイトでは「重複コンテンツ」がなぜか「未登録」「登録済み」に移動する事象が見られますので「放置するべきではない」と言えるでしょう。