asp.net mvc从搜索引擎抓取中排除某个操作

pil*_*ili 6 asp.net-mvc seo asp.net-mvc-3 asp.net-mvc-4

有没有办法Controller从搜索引擎抓取中排除某个操作?是否有MVC动词(属性),可以添加到动作名称上方?

我想从搜索引擎抓取中排除以下网址

Home/Secret?type=1
Run Code Online (Sandbox Code Playgroud)

但我希望这可用于搜索引擎抓取

Home/Search
Run Code Online (Sandbox Code Playgroud)

Val*_*mas 10

我认为您需要动态生成robots.txt文件.

您应该创建一个RobotController来提供robots.txt文件.

检查参考

与上述链接相关的是一个关于允许.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();
}
Run Code Online (Sandbox Code Playgroud)

添加Robots.cshtml

映射路由,以便对文件的调用将调用上面的操作.

routes.MapRoute("Robots.txt",
                "robots.txt",
                new { controller = "Home", action = "Robots" });
Run Code Online (Sandbox Code Playgroud)

以下是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

......以及区域.

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

所以请记住,解决方案依赖于命名空间,并欢迎任何人提供的改进.

最后,您需要正确编写机器人文件,包括任何标头信息和通配符支持.


Ste*_*n V 2

如果它可以公开访问,并且特别链接在页面上,则机器人可以/将会找到它。您可以在链接上使用rel="nofollow",在页面本身上使用noindex 元标记Disallow,或使用 robots.txt 文件对页面建立索引。这将阻止所有诚实的搜索引擎(如 Google、Bing、Yahoo)对链接进行索引或跟踪,但不会阻止随机机器人查看页面。

尽管如此,该 URL 仍可供公众访问。人类可以访问它,然后计算机也可以。如果您想阻止公众访问它,您可能需要研究用户身份验证。