robots.fichier txt pour différents domaines d'un même site

j'ai un ASP.NET application web MVC 4 accessible à partir de plusieurs domaines différents. Le site est entièrement localisé sur la base du domaine dans la requête (similaire dans le concept à cette question ).

je veux inclure un robot.je veux localiser les robots.txt fichier basé sur le domaine, mais je suis conscient que je ne peux avoir un physique "des robots.txt " fichier texte dans le répertoire du système de fichiers d'un site.

Quelle est la manière la plus facile/la meilleure (et est-il même possible) d'utiliser ASP.NET MVC framework pour réaliser un robot.txt fichier par domaine de sorte que le même site d'installation Sert de contenu à chaque domaine, mais le contenu du fichier robots est localisé en fonction du domaine demandé?

20
demandé sur Community 2013-06-11 02:21:53

1 réponses

le processus est raisonnablement simple:

L'action de contrôleur d'approche

  • à l'aide de votre tableau des routes, cartographiez vos robots.txt path vers une action dans un controller (j'utilise controller et action comme exemple simple pour vous lancer), tout comme vous le feriez pour n'importe quel autre controller et vue pour un chemin donné.
  • dans L'Action, vérifiez le domaine dans la demande et choisissez vos robots.contenu txt pour ce domaine.
  • retourner le fichier approprié à partir du disque en utilisant quelque chose comme:

l'échantillon suivant suppose un seul robot de haut niveau.fichier txt:

// In App_Start/RouteConfig:
public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  routes.MapRoute(
    name: "robots",
    url: "robots.txt",
    defaults: new { controller = "Seo", action = "Robots" }
);

// The controller:
public class SeoController : Controller {
  public ActionResult Robots() {
    var robotsFile = "~/robots-default.txt";
    switch (Request.Url.Host.ToLower()) {
      case "stackoverflow.com":
        robotsFile = "~/robots-so.txt";
        break;
      case "meta.stackoverflow.com":
        robotsFile = "~/robots-meta.txt";
        break;
    }
    return File(robotsFile, "text/plain");
  }
}

L'une des façons les plus faciles de faire fonctionner cette option est de s'assurer que le module d'acheminement est appelé pour toutes les requêtes utilisant runAllManagedModulesForAllRequests dans le web.config (à ne pas l'utiliser, voir le paragraphe suivant):

<system.webServer>
  <handlers>
    ...
  </handlers>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

C'est ce n'est pas une bonne chose en général car maintenant tous les fichiers statiques (css, js, txt) passent par des gestionnaires gérés avant vers le gestionnaire de fichier statique. IIS est vraiment bon à servir des fichiers statiques rapide (un site de fichier en grande partie statique sera max sur votre disque I/O chemin avant le CPU), donc pour éviter cette performance frapper l'approche recommandée est que le web.section échantillon de configuration ci-dessous. Notez la similitude avec le handler ExtensionlessUrlHandler-Integrated-4.0 dans les applications de modèle MVC 4 de Visual Studio:

<system.webServer>
  <handlers>
    <add name="Robots-Integrated-4.0"
         path="/robots.txt" verb="GET" 
         type="System.Web.Handlers.TransferRequestHandler" 
         preCondition="integratedMode,runtimeVersionv4.0" />
    ... the original handlers ...
  </handlers>
  <modules runAllManagedModulesForAllRequests="false" />
</system.webServer>       

avantages / inconvénients

le les avantages de ce type d'approche deviennent apparents dès que l'on commence à l'utiliser:

  • vous pouvez dynamiquement générer des robots.les fichiers txt en utilisant les helpers pour générer des urls D'Action que vous pouvez ensuite ajouter tout/partie des robots de template.fichier txt.
  • vous pouvez consulter le robot user agent pour retourner différents fichiers robots par robot user agent""
  • vous pouvez utiliser le même contrôleur pour la sortie sitemap.fichiers xml pour le web crawler
  • vous pourriez gérer le contenu des robots à partir d'une table de base de données qui peut facilement être administré par les utilisateurs du site.

Sur le revers de la médaille,

  • votre fichier de robots complique maintenant votre table de routes, et il n'a pas vraiment besoin de
  • vous aurez besoin d'optimiser la mise en cache pour éviter des lectures de disque constantes. Cependant, c'est la même chose pour toute approche que vous adoptez.

se rappeler aussi que différents robots.les fichiers txt peuvent être utilisés pour différents sous-répertoires. Cela devient difficile avec l'approche par route et par contrôleur, de sorte que l'approche IHttpHandler (ci-dessous) est plus facile pour cette situation.

La IHttpHandler approche

vous pouvez également le faire avec un personnalisé IHttpHandler enregistré dans votre web.config . Je souligne coutume comme cela évite la nécessité de faire en sorte que tous les contrôleurs voient toutes les requêtes (avec runAllManagedModulesForAllRequests="true" , contrairement à l'ajout d'un gestionnaire de route personnalisé dans votre table de route.

il s'agit peut-être d'une approche plus légère que celle du contrôleur, mais il faudrait une énorme circulation sur place pour remarquer la différence. Son autre avantage est un morceau de code réutilisable que vous pouvez utiliser pour tous vos sites. Vous pouvez également ajouter une section de configuration personnalisée pour configurer le robot utilisateur agent / nom de domaine / chemin mappages des fichiers des robots.

<system.webServer>
  <handlers>
    <add name="Robots" verb="*" path="/robots.txt"
         type="MyProject.RobotsHandler, MyAssembly" 
         preCondition="managedHandler"/>
  </handlers>
  <modules runAllManagedModulesForAllRequests="false" />
</system.webServer>
public class RobotsHandler: IHttpHandler
{
  public bool IsReusable { get { return false; } }
  public void ProcessRequest(HttpContext context) {
    string domain = context.Request.Url.Host;
    // set the response code, content type and appropriate robots file here
    // also think about handling caching, sending error codes etc.
    context.Response.StatusCode = 200;
    context.Response.ContentType = "text/plain";

    // return the robots content
    context.Response.Write("my robots content");
  }
}
"1519180920 les" robots".txt dans les sous-répertoires

pour servir les robots pour les sous-répertoires ainsi que la racine du site, vous ne pouvez pas utiliser l'approche du contrôleur facilement; l'approche du gestionnaire est plus simple dans ce scénario. Cela peut être configuré pour ramasser des robots.fichier txt demandes pour tout sous-répertoire et les traiter en conséquence. Vous pouvez alors choisir de retourner 404 pour certains répertoires, ou une sous-section des robots fichier pour les autres.

je le mentionne expressément ici car cette approche peut également être utilisée pour le plan du site.des fichiers xml, pour servir des sitemaps différents pour différentes sections du site, des sitemaps multiples qui font référence les uns aux autres, etc.


Autres Références:

52
répondu Andy Brown 2013-06-11 08:36:19