6

Controllerアクションを検索エンジンのクロールから除外する方法はありますか? アクション名の上に追加できるMVC動詞 (属性) はありますか?

次の URL を検索エンジンのクロールから除外したい

Home/Secret?type=1

しかし、これを検索エンジンのクロールで利用できるようにしたい

Home/Search
4

4 に答える 4

10

robots.txt ファイルを動的に生成する必要があると思います。

robots.txt ファイルを提供するには、RobotController を作成する必要があります。

ここで参照を確認してください

上記のリンクに関連して、.txt 拡張子をアクションで提供できるようにすることに関する質問がありました: https://stackoverflow.com/a/14084127/511438

public ActionResult Robots()
{
    Response.ContentType = "text/plain";
    //-- Here you should write a response with the list of 
    //areas/controllers/action for search engines not to follow.
    return View();
}

Robots.cshtml を追加します。

ファイルへの呼び出しが代わりに上記のアクションを呼び出すようにルートをマップします。

routes.MapRoute("Robots.txt",
                "robots.txt",
                new { controller = "Home", action = "Robots" });

属性を持つ領域/コントローラー/アクションのリストを取得するためのコードを含む NoRobots 属性を次に示します。完全な名前空間テキストを解釈して申し訳ありません。誰かが反射を見て、物事をより良く解決することを望んでいます.

public sealed class NoRobotsAttribute : System.Attribute
{

    public static IEnumerable<MethodInfo> GetActions()
    {
        return Assembly.GetExecutingAssembly().GetTypes()
               .Where(t => (typeof(Controller).IsAssignableFrom(t)))
               .SelectMany(
                    type =>
                    type.GetMethods(BindingFlags.Public | BindingFlags.Instance)
                        .Where(a => a.ReturnType == typeof(ActionResult))
                 );

    }
    public static IEnumerable<Type> GetControllers()
    {
        return Assembly.GetExecutingAssembly().GetTypes()
               .Where(t => (typeof(Controller).IsAssignableFrom(t)));

    }


    public static List<string> GetNoRobots()
    {
        var robotList = new List<string>();

        foreach (var methodInfo in GetControllers().Where(w => w.DeclaringType != null))
        {
            var robotAttributes = methodInfo
                    .GetCustomAttributes(typeof(NoRobotsAttribute), false)
                    .Cast<NoRobotsAttribute>();

            foreach (var robotAttribute in robotAttributes)
            {
                 //-- run through any custom attributes on the norobots attribute. None currently specified.
            }
            List<string> namespaceSplit = methodInfo.DeclaringType.FullName.Split('.').ToList();

            var controllersIndex = namespaceSplit.IndexOf("Controllers");
            var controller = (controllersIndex > -1 ? "/" + namespaceSplit[controllersIndex + 1] : "");
            robotList.Add(controller);

        }

        foreach (var methodInfo in GetActions())
        {
            var robotAttributes = methodInfo
                    .GetCustomAttributes(typeof(NoRobotsAttribute), false)
                    .Cast<NoRobotsAttribute>();

            foreach (var robotAttribute in robotAttributes)
            {
                 //-- run through any custom attributes on the norobots attribute. None currently specified.
            }

            List<string> namespaceSplit = methodInfo.DeclaringType.FullName.Split('.').ToList();

            var areaIndex = namespaceSplit.IndexOf("Areas");
            var area = (areaIndex > -1 ? "/" + namespaceSplit[areaIndex + 1] : "");

            var controllersIndex = namespaceSplit.IndexOf("Controllers");
            var controller = (controllersIndex > -1 ? "/" + namespaceSplit[controllersIndex + 1] : "");

            var action = "/" + methodInfo.Name;

            robotList.Add(area + controller + action);

        }
        return robotList;
    }
}

使用法:

[NoRobots] //Can be applied at controller or action method level.
public class HomeController : Controller
{
    [NoRobots]
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        List<string> x = NoRobotsAttribute.GetNoRobots();
        //-- Just some test code that wrote the result to a webpage.
        return View(x);
    }
}

...そしてエリア用。

namespace MVC.Temp.Areas.MyArea.Controllers
{
    using MVC.Temp.Models.Home;

    [NoRobots]
    public class SubController : Controller
    {
        [NoRobots]
        public ActionResult SomeAction()
        {
            return View();
        }

    }
}

したがって、ソリューションは名前空間に依存しており、誰かが提供できる改善を歓迎することに注意してください。

最後に、ヘッダー情報とワイルドカードのサポートを含め、ロボット ファイルを正しく記述する必要があります。

于 2013-08-11T22:12:21.507 に答える
2

一般にアクセス可能で、特にページにリンクされている場合、ロボットはそれを見つけることができます。rel="nofollow"リンクで使用したり、ページ自体でnoindex メタ タグDisallowを使用したり、robots.txt ファイルを使用してページのインデックスを作成したりできます。これにより、すべての正直な検索エンジン (Google、Bing、Yahoo など) がインデックスを作成したり、リンクをたどったりするのを防ぐことができますが、ランダムなボットがページを閲覧するのを防ぐことはできません。

それでもなお、URL は一般に公開されています。人間がアクセスでき、次にコンピュータがアクセスできます。一般の人がアクセスできないようにしたい場合は、おそらくユーザー認証を検討する必要があります。

于 2013-08-11T21:40:27.207 に答える