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)
所以请记住,解决方案依赖于命名空间,并欢迎任何人提供的改进.
最后,您需要正确编写机器人文件,包括任何标头信息和通配符支持.
如果它可以公开访问,并且特别链接在页面上,则机器人可以/将会找到它。您可以在链接上使用rel="nofollow",在页面本身上使用noindex 元标记Disallow,或使用 robots.txt 文件对页面建立索引。这将阻止所有诚实的搜索引擎(如 Google、Bing、Yahoo)对链接进行索引或跟踪,但不会阻止随机机器人查看页面。
尽管如此,该 URL 仍可供公众访问。人类可以访问它,然后计算机也可以。如果您想阻止公众访问它,您可能需要研究用户身份验证。
| 归档时间: |
|
| 查看次数: |
2432 次 |
| 最近记录: |