Generar dinámicamente robots.txt para sitios ASP.NET Core basados ​​en el entorno

Estoy poniendo parte de las partes más antiguas de WebForms de mi sitio que todavía se ejecutan en metal desnudo en ASP.NET Core y Azure App Services, y mientras lo hago me di cuenta de que quiero asegurarme de que mis sitios de preparación no obtengan indexado por Google / Bing.


Ya tengo un archivo robots.txt, pero quiero uno que sea específico para la producción y otros que sean específicos para el desarrollo o la puesta en escena. Pensé en varias formas de resolver esto. Podría tener un robots.txt estático y otro robot-staging.txt y copiar condicionalmente uno sobre el otro durante mi canalización de Azure DevOps CI / CD.


Entonces me di cuenta de que lo más simple sería hacer que robots.txt sea dinámico. Pensé en escribir middleware personalizado, pero eso sonaba como una molestia y más código que necesitaba. Quería ver cuán simple podría ser esto.




  • Puede hacer esto como un solo middleware en línea, y solo lambda y func y linq, diablos, todo en una línea
  • Puede escribir su propio middleware y hacer muchas opciones, luego activarlo mejor en env.IsStaging (), etc.
  • Puede crear una sola página de Razor con ayuda de etiquetas de entorno.

El último parecía más fácil y también significaba que podía cambiar el cshtml sin una compilación completa, así que hice una página única de la maquinilla de afeitar RobotsTxt.cshtml. Sin modelo de página, sin código detrás. Luego usé el ayudante de etiqueta de entorno incorporado para generar condicionalmente partes del archivo. Tenga en cuenta también que forcé el tipo mime a text / plain y no uso una página de diseño, ya que esto debe ser independiente.


@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> 

Luego me aseguro de que mis sistemas de puesta en escena y / o producción tengan las variables ASPNETCORE_ENVIRONMENT establecidas correctamente.


ASPNETCORE_ENVIRONMENT=Staging

También quiero señalar lo que puede parecer un espaciado extraño y cómo algunos textos se unen contra los TagHelpers. Recuerde que la etiqueta de un TagHelper a veces "desaparece" (se anula) cuando se hace lo suyo, pero el espacio en blanco a su alrededor permanece. Entonces, quiero que User-agent: * tenga una línea, y luego No permitir que aparezca inmediatamente en la siguiente línea. Si bien podría ser un código fuente más bonito que comience en otra línea, entonces no es un archivo correcto. Quiero que el resultado sea ajustado y, sobre todo, correcto. Esto es para la puesta en escena:


 User-agent: * Disallow: / 

Esto ahora me da un archivo robots.txt en / robotstxt pero no en /robots.txt. ¿Ves el problema? Robots.txt es un archivo (o uno falso), así que necesito asignar una ruta desde la solicitud de /robots.txt a la página Razor llamada RobotsTxt.cshtml.


Aquí agrego RazorPagesOptions en mi Startup.cs con una PageRoute personalizada que asigna /robots.txt a / robotstxt. (Siempre he encontrado que esta API es molesta ya que los parámetros deberían, en mi humilde opinión, invertirse como ("de", "a"), así que ten cuidado con eso, para que no pierdas diez minutos como acabo de hacer.


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

Y eso es todo! Simple y limpio.


También puede agregar el almacenamiento en caché si lo desea, ya sea como un middleware más grande o incluso en la página cshtml, como


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

pero dejaré esa pequeña optimización como ejercicio para el lector.


ACTUALIZACIÓN: Después de terminar, encontré este middleware de robots.txt y NuGet en GitHub. Todavía estoy contento con mi código y no me importa no tener una dependencia externa, pero es bueno archivarlo para futuras necesidades y proyectos más sofisticados.



¿Cómo maneja sus necesidades de robots.txt? ¿Incluso tienes uno?

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


All Articles