Créez dynamiquement robots.txt pour les sites ASP.NET Core

Maintenant, je suis en train de transférer certains des anciens formulaires Web de mon site, qui fonctionnent actuellement sur du métal nu, vers les services d'application ASP.NET Core et Azure. Dans le processus, j'ai réalisé que je veux m'assurer que mes sites ne sont pas indexés par Google, Yandex, Bing et autres moteurs de recherche.


J'ai déjà un fichier robots.txt, mais je veux que l'un ne serve qu'à la production et l'autre au développement. Je réfléchissais à plusieurs façons de résoudre ce problème. Je pourrais avoir un fichier robots.txt statique, un fichier robots-staging.txt et copier conditionnellement l'un au-dessus de l'autre dans mon pipeline Azure DevOps CI / CD.


Ensuite, j'ai réalisé que la chose la plus simple était de rendre dynamique robots.txt. Je pensais écrire mon propre middleware, mais cela semblait être une tâche difficile avec beaucoup de code. Je voulais voir à quel point cela peut être simple.




  • Vous pouvez l'implémenter en tant que middleware intégré: juste lambda, func et linq sur une seule ligne
  • Vous pouvez écrire votre propre middleware et faire de nombreuses options, puis l'activer dans l'environnement d'env.IsStaging () ou autre
  • Vous pouvez créer une seule page Razor avec un environnement TegHelpers

La dernière option semblait la plus simple et signifiait que je pouvais changer cshtml sans recompiler complètement, donc j'ai créé une seule page Razor RobotsTxt.cshtml. Ensuite, j'ai utilisé l'assistant d'environnement balisé intégré pour générer de manière conditionnelle des parties du fichier. Notez également que j'ai forcé le type mime à être text / plain et à ne pas utiliser la page de mise en page, car elle 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> 

Ensuite, je vérifie si les variables ASPNETCORE_ENVIRONMENT sont correctement définies sur mes systèmes de production et / ou de transfert.


ASPNETCORE_ENVIRONMENT=Staging

Je veux également souligner à quoi pourrait ressembler un espacement étrange et comment certains textes reposent sur TagHelpers. N'oubliez pas que la balise TagHelper «disparaît» parfois (est supprimée) lorsqu'elle fait son travail, mais des lacunes subsistent autour d'elle. Je veux donc que User-agent: * ait une ligne, puis Disallow apparaîtra immédiatement sur la ligne suivante. Bien que le code source puisse être plus joli s'il démarre sur une ligne différente, ce sera le mauvais fichier. Je veux que le résultat soit correct. C'est pour comprendre:


 User-agent: * Disallow: / 

Cela me donne le fichier robots.txt dans / robotstxt, mais pas dans /robots.txt. Tu vois l'erreur? Robots.txt est un (faux) fichier, j'ai donc besoin de mapper l'itinéraire de la demande à /robots.txt à la page Razor nommée RobotsTxt.cshtml.


Ici, j'ajoute RazorPagesOptions à mon Startup.cs avec un PageRoute personnalisé qui mappe /robots.txt à / robotstxt. (J'ai toujours trouvé cette API ennuyeuse, car les paramètres, à mon avis, devraient être modifiés en ("de", "à"), alors assurez-vous de ne pas passer dix minutes supplémentaires, 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 transparent.


Vous pouvez également ajouter la mise en cache, si vous le souhaitez, comme un middleware plus grand ou même sur une page cshtml, par exemple


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

mais je vais laisser cette petite optimisation comme un exercice pour vous.


MISE À JOUR: Lorsque j'ai terminé, j'ai trouvé ce middleware robots.txt et NuGet sur GitHub. Je suis toujours satisfait de mon code et ne me dérange pas de l'absence de dépendance externe (l'indépendance externe n'est pas importante pour moi), mais il est agréable de le conserver pour de futures tâches et projets plus complexes.


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


All Articles