Ahora estoy en el proceso de transferir algunos de los antiguos WebForms de mi sitio, que actualmente están trabajando en metal desnudo, a los servicios de aplicaciones ASP.NET Core y Azure. En el proceso, me di cuenta de que quiero asegurarme de que mis sitios no estén indexados por Google, Yandex, Bing y otros motores de búsqueda.
Ya tengo un archivo robots.txt, pero quiero que uno sirva solo para producción y el otro para desarrollo. Estaba pensando en varias formas de resolver este problema. Podría tener un archivo robots.txt estático, un archivo robots-staging.txt y copiar condicionalmente uno encima del otro en mi canal de Azure DevOps CI / CD.
Luego me di cuenta de que lo más simple es hacer que robots.txt sea dinámico. Estaba pensando en escribir mi propio middleware, pero parecía una tarea problemática con mucho código. Quería ver lo simple que puede ser.

- Puede implementar esto como middleware incrustado: solo lambda, func y linq en una línea
- Puede escribir su propio middleware y hacer muchas opciones, luego activarlo en el entorno de env.IsStaging () u otro
- Puede crear una sola página Razor con un entorno TegHelpers
La última opción parecía la más simple y significaba que podía cambiar cshtml sin volver a compilar por completo, así que creé una sola página Razor RobotsTxt.cshtml. Luego utilicé el ayudante de entorno etiquetado incorporado para generar condicionalmente partes del archivo. También tenga en cuenta que forcé el tipo mime para que sea text / plain y no use la página de diseño, ya que debe ser autónomo.
@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 verifico si las variables ASPNETCORE_ENVIRONMENT están configuradas correctamente en mis etapas y / o sistemas de producción.

También quiero señalar cómo podría verse un espaciado extraño y cómo algunos textos descansan en TagHelpers. Recuerde que la etiqueta TagHelper a veces "desaparece" (se elimina) cuando hace su trabajo, pero quedan vacíos a su alrededor. Por lo tanto, quiero que el User-agent: * tenga una línea, y luego Disallow aparecerá inmediatamente en la siguiente línea. Aunque el código fuente puede ser más bonito si comienza en una línea diferente, entonces será el archivo incorrecto. Quiero que el resultado sea correcto. Esto es para entender:
User-agent: * Disallow: /
Esto me da el archivo robots.txt en / robotstxt, pero no en /robots.txt. ¿Ves el error? Robots.txt es un archivo (falso), por lo que necesito asignar la ruta desde la solicitud a /robots.txt a la página Razor llamada RobotsTxt.cshtml.
Aquí agrego RazorPagesOptions a mi Startup.cs con un PageRoute personalizado que asigna /robots.txt a / robotstxt. (Siempre encontré esta API molesta, ya que los parámetros, en mi opinión, deberían cambiarse a ("de", "a"), así que asegúrese de no gastar diez minutos adicionales, 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 transparente.
También puede agregar el almacenamiento en caché, si lo desea, como un middleware más grande o incluso en una página cshtml, por ejemplo
context.Response.Headers.Add("Cache-Control", $"max-age=SOMELARGENUMBEROFSECONDS");
pero dejaré esta pequeña optimización como ejercicio para ti.
ACTUALIZACIÓN: cuando terminé, encontré este middleware robots.txt y NuGet en GitHub. Todavía estoy contento con mi código y no me importa la ausencia de dependencia externa (la independencia externa no es importante para mí), pero es bueno mantenerlo para futuras tareas y proyectos más complejos.