有没有办法从搜索引擎抓取中排除控制器操作?是否有MVC动词(属性),可以添加到动作名称上方?
我想从搜索引擎抓取中排除以下网址
Home/Secret?type=1
但我希望这可用于搜索引擎抓取
Home/Search
解决方法
我认为您需要动态生成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(); }
添加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(); } } }
所以请记住,解决方案依赖于命名空间,并欢迎任何人提供的改进.