Génération dynamique de robots.txt pour les sites ASP.NET Core en fonction de l'environnement

Je mets une partie des anciennes parties WebForms de mon site qui fonctionnent toujours sur du métal nu vers ASP.NET Core et Azure App Services, et pendant que je le fais, je me suis rendu compte que je veux m'assurer que mes sites de transit ne reçoivent pas indexé par Google / Bing.


J'ai déjà un fichier robots.txt, mais j'en veux un qui soit spécifique à la production et d'autres qui soient spécifiques au développement ou à la mise en scène. J'ai réfléchi à plusieurs façons de résoudre ce problème. Je pourrais avoir un robots.txt statique et un autre robots-staging.txt et copier conditionnellement l'un sur l'autre pendant mon pipeline Azure DevOps CI / CD.


Ensuite, j'ai réalisé que la chose la plus simple possible serait de simplement rendre le fichier robots.txt dynamique. J'ai pensé à écrire un middleware personnalisé, mais cela sonnait comme un tracas et plus de code nécessaire. Je voulais voir à quel point cela pouvait être simple.




  • Vous pouvez le faire comme un middleware unique en ligne, et juste lambda et func et linq le diable tout sur une seule ligne
  • Vous pouvez écrire votre propre middleware et faire beaucoup d'options, puis l'activer sur env.IsStaging (), etc.
  • Vous pouvez créer une seule page Razor avec des taghelpers d'environnement.

Le dernier semblait le plus simple et signifierait également que je pouvais changer le cshtml sans une recompilation complète, j'ai donc fait une page de rasoir unique RobotsTxt.cshtml. Aucun modèle de page, aucun code derrière. Ensuite, j'ai utilisé l'assistant de balise d'environnement intégré pour générer conditionnellement des parties du fichier. Notez également que j'ai forcé le type mime à text / plain et je n'utilise pas de page de mise en page, car cela doit être autonome.


@page @{ Layout = null; this.Response.ContentType = "text/plain"; } # /robots.txt file for http://www.hanselman.com/ User-agent: * <environment include="Development,Staging">Disallow: /</environment> <environment include="Production">Disallow: /blog/private Disallow: /blog/secret Disallow: /blog/somethingelse</environment> 

Je m'assure ensuite que mes variables Staging et / ou Production ont des variables ASPNETCORE_ENVIRONMENT correctement définies.


ASPNETCORE_ENVIRONMENT=Staging

Je veux également souligner ce qui peut ressembler à un espacement impair et comment du texte est renforcé contre les TagHelpers. Rappelez-vous que la balise d'un TagHelper "disparaît" (est élidée) quand il a fait son truc, mais l'espace autour de lui reste. Je veux donc que User-agent: * ait une ligne, puis Disallow pour apparaître immédiatement sur la ligne suivante. Bien qu'il puisse être plus joli de faire démarrer le code source sur une autre ligne, ce n'est pas un fichier correct alors. Je veux que le résultat soit serré et surtout correct. C'est pour la mise en scène:


 User-agent: * Disallow: / 

Cela me donne maintenant un fichier robots.txt dans / robotstxt mais pas dans /robots.txt. Vous voyez le problème? Robots.txt est un fichier (ou un faux), j'ai donc besoin de mapper un itinéraire depuis la demande de /robots.txt vers la page Razor appelée RobotsTxt.cshtml.


Ici, j'ajoute un RazorPagesOptions dans mon Startup.cs avec un PageRoute personnalisé qui mappe /robots.txt à / robotstxt. (J'ai toujours trouvé cette API ennuyeuse car les paramètres devraient, à mon humble avis, être inversés comme ("de", "à") alors faites attention à cela, de peur de perdre dix minutes comme je viens de le faire.


 public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/robotstxt", "/Robots.Txt"); }); } 

Et c'est tout! Simple et propre.


Vous pouvez également ajouter la mise en cache si vous le souhaitez, soit en tant que middleware plus grand, soit même dans la page cshtml, comme


 context.Response.Headers.Add("Cache-Control", $"max-age=SOMELARGENUMBEROFSECONDS"); 

mais je vais laisser cette petite optimisation comme un exercice au lecteur.


MISE À JOUR: Après avoir terminé, j'ai trouvé ce middleware robots.txt et NuGet sur GitHub. Je suis toujours satisfait de mon code et cela ne me dérange pas de ne pas avoir de dépendance externe, mais c'est bien de classer celui-ci pour de futurs besoins et projets plus sophistiqués.



Comment gérez-vous vos besoins en robots.txt? En avez-vous même un?

Source: https://habr.com/ru/post/fr457208/


All Articles