2013-08-11 6 views
6

Esiste un modo per escludere un'agenda Controller dalla ricerca per indicizzazione del motore di ricerca? Esiste un verbo MVC (Attributo), che può essere aggiunto sopra il nome dell'azione?asp.net mvc esclude un'azione dalla scansione del motore di ricerca

voglio escludere la seguente URL dal motore di ricerca strisciare

Home/Secret?type=1 

Ma io voglio che questo sia disponibile al motore di ricerca strisciando

Home/Search 

risposta

2

Se è accessibile al pubblico, e in particolare collegato su un pagina, un robot può/lo troverà. È possibile utilizzare rel="nofollow" sui collegamenti, utilizzare noindex meta tag nella pagina stessa oppure utilizzare un file robots.txt per l'indicizzazione delle pagine tramite Disallow. Ciò impedirà a tutti i motori di ricerca onesti (come Google, Bing, Yahoo) di indicizzare o seguire i collegamenti, ma non impedirà ai bot casuali di guardare le pagine.

Tuttavia, l'URL è accessibile al pubblico. Un umano può visitarlo, quindi un computer può. Se si desidera impedire che sia accessibile al pubblico, probabilmente si desidera esaminare l'autenticazione dell'utente.

10

Penso che sia necessario generare dinamicamente un file robots.txt.

È necessario creare un RobotController per servire un file robots.txt.

Check Reference Here

correlati al link qui sopra era una domanda di permettere l'estensione .txt per essere servito da un'azione: 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(); 
} 

Aggiungi un Robots.cshtml

Mappa un instradare in modo che una chiamata al file chiamerà invece l'azione sopra.

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

Ecco l'attributo NoRobots con il codice per ottenere un elenco di aree/controllori/azioni che hanno l'attributo. Mi dispiace per l'interpretazione del testo completo del namespace. Mi piacerebbe che qualcuno guardasse il riflesso per risolvere meglio le cose.

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; 
    } 
} 

Usage:

[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); 
    } 
} 

... e per aree.

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

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

    } 
} 

Quindi, tenere a mente che la soluzione si basa su spazi dei nomi e sarebbe il benvenuto eventuali miglioramenti qualcuno può offrire.

Infine, è necessario scrivere correttamente il file del robot, comprese le informazioni di intestazione e il supporto di caratteri jolly.

0

Potrebbe essere solo necessario modificare il routing. Puoi aggiungere la seguente route.Cambierà indirizzo Home/Secret?type=1 a Home/Search

routes.MapRoute(
       name: "NewRoute", 
       url: "{controller}/Search", 
       defaults: new { controller = "Home", action = "Secret", type = UrlParameter.Optional } 
      ); 

Si può anche nascondere nome del controller troppo:

routes.MapRoute(
       name: "NewRoute", 
       url: "LadyGaga/Search", 
       defaults: new { controller = "Home", action = "Secret", type = UrlParameter.Optional } 
      ); 
0

Vuoi nasconderlo dai motori di ricerca, o può nessuno visita che URL? Perché chiunque richieda il tuo file robots.txt troverà gli URL lì dentro.

Non puoi semplicemente mettere in atto l'autorizzazione che consente solo a determinati utenti di accedere a tali azioni? Quando viene presentato con un HTTP 401, i motori di ricerca non lo indicizzeranno.