この記事は 驚異のFANZA女優検索 Advent Calendar 2021 の 16 日目の記事です。
SEO&OGP対応
SEOに対して色々語れる程本気でやっていないが最低限各ページに設定していることだけ。ASP.NETでやるならSEOとOGPはまとめてやるのがいいと思う。まず各ページに設定できるようにViewDataを使う。
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"]</title>
<meta property="og:type" content="website">
<meta property="og:title" content="@ViewData["Title"]">
<meta property="og:url" content="@ViewData["OgUrl"]">
<meta property="og:image" content="@ViewData["OgImage"]">
<meta property="og:description" name="description" content="@ViewData["OgDescription"]" />
<meta property="og:site_name" content="驚異のFANZA女優検索">
<meta property="og:locale" content="ja_JP">
これでViewDataを各ページ毎に設定する。例えば商品ページなら以下。
@{
ViewData["Title"] = $"{Model.Title} | {ViewData["ActressName"]} | 驚異のFANZA女優検索";
ViewData["OgImage"] = Model.ImageUrlLarge;
ViewData["OgDescription"] = $"{Model.Title} | {ViewData["ActressName"]}のページ。発売日:{Model.Date}。時間:{Model.Volume}分。女優:{Model.ActressNames}。ジャンル:{Model.GenreNames}。シリーズ:{Model.SeriesNames}。メーカー:{Model.MakerNames}。";
}
これで、SEOにはTitle設定した文字がタイトルに、OgDescriptionに設定した文字が説明文になるし、OGPにもタイトルと説明文、画像が出るようになる。後は実際にGoogleやTwitterで見てどういう感じか確認して、内容を詰めていく。
#URLに日本語情報も入れる
あとAmazonのようにURL自体に女優名や商品名を入れられるようにした。女優名や商品名は入れても入れなくてもどちらでも良いので、例えばURL自体に文字情報を入れてシェアするといったことができる。ただ、これを何も考えずにするとURLがばらついてしまって、SEO的に不利になる。ページが重複している場合に、正規URLを検索エンジンに示すための記述方法がある。それがcanonicalだ。
[Route("/actress/{id}")] //本当のURL ← これをcanonicalにする。
[Route("/actress/{id}/{name}")] //装飾付きのURL。女優名はあってもなくても同じなのでURLだけで内容を伝えたい場合に使う。
[Route("/actress/{actressId}/product/{id}")] //本当のURL ← これをcanonicalにする。
[Route("/actress/{actressId}/product/{id}/{name}")] //装飾付きのURL。作品名はあってもなくても同じなのでURLだけで内容を伝えたい場合に使う。
これで、ルーティングしてきたURLに対して以下のようにすればCanonicalを指定できる。
<head>
<link rel="canonical" href="@ViewData["Canonical"]">
ViewData["Canonical"] = $"{Request.Scheme}://{Request.Host}{Request.PathBase}/{id}";
これで例えば以下のようなURLのどちらを使ってもGoogleには上で登録される。
https://fanza-actress-bust-search.azurewebsites.net/actress/25929
https://fanza-actress-bust-search.azurewebsites.net/actress/25929/女優の名前
#サイトマップを置いてみる
次にこれもSEOに関わるサイトマップについて。最初はルーティングして動的に返すようにしていた。
[Route("/sitemap.xml")]
ただこの実装でデータベースへのアクセスをしており、量が多いと重くなってしまった。サイトマップは5万ページを超す場合はsitemapIndex.xmlを作って、そこに各ページへのリンクをはって、1ページ毎に5万ページ分の内容を追加する形になる。現状60万ページぐらいあるので13ページある。これだと1Pを開くのにも時間がかかる。試しに130ページにして5000ページ分にしてみたが、それでも重かった。そこでデータ取得の自動化をしている処理の中で、このxmlを静的に作って、そのままサイトにアップする仕組みに変えた。静的に作られたファイルを置くだけなので当然速い。
#robots.txtが置いてみる
さて、サイトマップを実際に置いてみたが、Google Search Consoleが何故かサイトマップを自動で認識してくれない。試しに手動で登録してみたら登録されたが、自動が駄目。理由は分からなかったが、色々調べるとrobots.txtを置いた方が良いという事が分かった。ところがこれを置いても上手くいかない。robots.txt によるブロックをテストで調べてみると、1行目の最初でエラーが出ていた。これは文字コードの問題だった。そこで文字コードを直したらテストは成功するようになったが、引き続きブロックされましたのエラーは出ていた。
#robots.txtがブロックしてしまう
この問題が何か月も解決出来ずに困っている。具体的にはGoogle Search Consoleで「robots.txt によりブロックされましたが、インデックスに登録しました」が出るが実際にはブロックされていない。ブロックされていると言われるURLをrobots.txt によるブロックをテストでテストすると成功する。成功するのにブロックされたと出るのだ。これが分からない。もし原因が分かる人がいれば是非是非教えて欲しい。