Google検索結果のタイトルが"HyperLink"などの意図しないタイトルになる - ASP.NET

ASP.NETで作成したサイトを公開し、Googleの検索エンジンに登録されたのち、登録したサイトを検索してみると、検索結果に表示された際に本来のタイトルとは異なるタイトルが表示される場合があります。("HyperLink"など)
この記事では原因と対策方法を紹介します。

原因

<title>タグが重複している

解説

ASP.NETで作成したページにtitleタグが複数設置されていると上記の問題が発生します。Webブラウザでは最初に記述されたTitleタグの内容をタイトルとして認識しますが、GoogleのクローラーなどはTitleタグが複数あった場合、どちらかを登録(または両方を登録)するため、意図しないタイトルが検索結果に表示されることがあります。

原因となるコード

よくある原因として、マスターページを利用した場合に発生します。

コード例

Master.Master (マスターページ)
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Master.master.cs" Inherits="Namespace" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
    <title></title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
      </asp:ContentPlaceHolder>
    </div>
  </form>
</body>
</html>
default.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Master.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Namespace.Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
  <title>くじらさんと一緒</title>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  (ここにコンテンツがあります。)
</asp:Content>

解説

上記のコードで問題が発生します。マスターページのTitleタグとコンテンツページの"くじらさんと一緒"が記述されたTitleタグが重複し、出力結果のHTMLは以下のようになります。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
	くじらさんと一緒
</title>
<title></title>
</head>
<body>
  <form method="post" action="" id="form1">
    (ここにコンテンツがあります。)
  </form>
</body>
Titleタグが重複するため、Titleが正しく決定できず、ページ内部の「ここにコンテンツがあります。」やAltの値などがGoogleによってページタイトルとして認識されるため、意図しない動作となります。

対策

PageオブジェクトのTitleプロパティを用いる。

AspxファイルのPageセクション内のTitleプロパティにタイトルを設定するとTitleが重複する問題を回避できます。

コード例

Master.Master (マスターページ)
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Master.master.cs" Inherits="Namespace" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
    <title></title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
      </asp:ContentPlaceHolder>
    </div>
  </form>
</body>
</html>
default.aspx
<%@ Page Title="くじらさんと一緒" Language="C#" MasterPageFile="~/Master.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Namespace.Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
  (ここにコンテンツがあります。)
</asp:Content>
補足
マスターページ側のTitleタグを削除し、コンテンツページ側のHead内のContentPlaceHolderにTitleタグを記述し、Titleタグを1つにした場合でも実行時にTitleタグが重複してしまいます。ページのタイトルは、PageセクションのTitleに記述する必要があります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2014-02-24
iPentec all rights reserverd.