検索結果に私のページのいくつかが表示されないようにしたいと思います。私の理解では、<head>
ページのセクション:
<meta name="robots" content="noindex,nofollow"/>
問題は、私のページが共通のレイアウトページを使用していることです。何かのようなもの:
@{
Layout = "~/Views/Shared/_VanillaLayout.cshtml";
}
レイアウトページ内には、多数のリンク、スクリプト、メタタグを含むヘッドセクションがあります。インデックス付け可能なページとインデックス付け不可能なページに対してこれを複製したくありません。
私の研究から、次のことがわかりました。-
<head>
セクション悪い。うまくいけば、私は何かを逃しており、これを行うための良い(悪いではない)方法があるか、上記のアプローチのいずれかが結局それほど悪くはありません。
私には、最も簡単な方法は<head>
ビュー内のデータを取り込むことを選択できるレイアウトファイルのタグ
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - My ASP.NET MVC Application</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width" />
<!-- Adding a RenderSection here, mark it as not required-->
@RenderSection("AdditionalMeta", false)
@Styles.Render("~/Content/css")
</head>
さて、追加のメタデータを追加する必要があるビューでは、ビューファイルの最後/開始点(モデル宣言後)に次のコードを追加するだけです
@section AdditionalMeta
{
<meta name="robots" content="noindex,nofollow"/>
}
すべてのRazorスタッフはサーバー側で処理されるため、a)JSにアイテムを追加しても、一部のクローラーがJSを実装しておらず、b)<head>
tag/etc。また、不要とマークされているということは、インデックスを作成したくないページを更新するだけで、アプリケーションのすべてのページに変数を設定する必要がないことを意味します。
共通のレイアウトの<head>
要素に、メタタグを使用して次の条件を追加できます。
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
@if (PageData["DisableIndexing"])
{
<meta name="robots" content="noindex,nofollow"/>
}
...
</head>
<body>
...
</body>
そのフラグは、Viewsフォルダーにあるメイン_ViewStart.cshtml
ファイルでデフォルトで無効に設定されます。つまり、デフォルトでは、どのページにもそのメタタグは追加されません。これは_ViewStartファイルになります。
@{
Layout = "~/Views/Shared/_VanillaLayout.cshtml";
PageData["DisableIndexing"] = false;
}
最後に、インデックス作成を無効にするページでは、そのフラグをオーバーライドするだけです。たとえば、Fooビューでインデックス作成を許可しない場合、次のようにします。
@model MyNamespace.MyFooModel
@{
ViewBag.Title = "Foo";
PageData["DisableIndexing"] = true;
}
...
特定のフォルダー内のすべてのビューでインデックス作成を無効にする必要がある場合は、PageData["DisableIndexing"] = true;
を設定するフォルダーに別の_ViewStart.cshtmlファイルを追加することもできます。
補足として、ViewBagを使用して_ViewStartからレイアウトにデータを渡すこともできますが、ViewStartでViewBagに直接アクセスできないため、コードは少し見苦しくなります。 ViewBagを使用する場合は、 この回答 を参照してください。
レイアウトページでメタタグを定義しておらず、単にページから追加したい場合は、次のようにできます。
レイアウトページ_VanillaLayout.cshtmlのheadセクションで、次のように@RenderSectionを使用します
<head>
<meta charset="utf-8">
@RenderSection("SeoRender", false)
</head>
ビューページで次のようにします
@{
Layout = "~/Views/Shared/_VanillaLayout.cshtml";
}
@section SeoRender{
@{
<title>testTitle</title>
<meta name="keyword" content="testkeyword">
<meta name="description" content="testdescription">
<meta name="author" content="testauthor">
}
そのため、ページ内で特定のメタタグなどを個別に定義できます。
古い質問ですが、それが誰かを助けるかもしれない場合、上のレイアウトで、私は使用しなければなりませんでした:
<head>
@RenderSection("MySection", required:false)
</head>
次に、everynested Layoutsで、セクションを再定義する必要がありました:
@section MySection {
@RenderSection("MySection", false)
}
最後に、.cshtml
ビューでセクションを定義しました:
@section MySection{
<meta name="robots" content="@Model.MetaContent"/>
@* or any other tag going to <head> *@
}
Jqueryで試してください。インデックスを作成したくないページで、
$('head').append('<meta name="robots" content="noindex,nofollow"/>');
編集:
別の試みは(これに応じて GooglebotはJavaScriptで行われたDOMの変更をクロールしますか? )jqueryライブラリの代わりに単純なjavascriptを試す
document.getElementsByTagName('head')[0].appendChild('<meta name="robots" content="noindex,nofollow"/>');