Criar dinamicamente robots.txt para sites ASP.NET Core

Agora, estou no processo de transferência de alguns dos WebForms antigos do meu site, atualmente trabalhando em bare metal, para os serviços de aplicativos ASP.NET Core e Azure. No processo, percebi que desejo garantir que meus sites não sejam indexados pelo Google, Yandex, Bing e outros mecanismos de pesquisa.


Já tenho um arquivo robots.txt, mas quero que um sirva apenas para produção e outro para desenvolvimento. Eu estava pensando em várias maneiras de resolver esse problema. Eu poderia ter um arquivo robots.txt estático, um arquivo robots-staging.txt e copiar condicionalmente um sobre o outro no meu pipeline de CI / CD do Azure DevOps.


Então percebi que a coisa mais simples é tornar o robots.txt dinâmico. Eu estava pensando em escrever meu próprio middleware, mas parecia uma tarefa problemática com muito código. Eu queria ver como isso pode ser simples.




  • Você pode implementar isso como middleware incorporado: apenas lambda, func e linq em uma linha
  • Você pode escrever seu próprio middleware e fazer várias opções, depois ativá-lo no ambiente de env.IsStaging () ou outro
  • Você pode criar uma única página Razor com um ambiente TegHelpers

A última opção parecia a mais simples e significava que eu poderia alterar o cshtml sem recompilar completamente, então criei um único Razor Page RobotsTxt.cshtml. Em seguida, usei o auxiliar de ambiente marcado interno para gerar condicionalmente partes do arquivo. Observe também que forcei o tipo MIME a ser texto / sem formatação e não use a página Layout, pois ela deve ser independente.


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

Em seguida, verifico se as variáveis ​​ASPNETCORE_ENVIRONMENT estão definidas corretamente nos meus sistemas de preparação e / ou produção.


ASPNETCORE_ENVIRONMENT=Staging

Também quero destacar como um espaçamento estranho pode parecer e como algum texto repousa nos TagHelpers. Lembre-se de que a tag TagHelper às vezes "desaparece" (é excluída) quando faz seu trabalho, mas as lacunas permanecem em torno dela. Então, eu quero que o User-agent: * tenha uma linha e, em seguida, Disallow aparecerá imediatamente na próxima linha. Embora o código-fonte possa ser mais bonito se iniciar em uma linha diferente, será o arquivo errado. Eu quero que o resultado esteja correto. Isto é para entender:


 User-agent: * Disallow: / 

Isso me fornece o arquivo robots.txt em / robotstxt, mas não em /robots.txt. Vê o erro? Robots.txt é um arquivo (falso), portanto, preciso mapear a rota da solicitação para /robots.txt para a página Razor chamada RobotsTxt.cshtml.


Aqui, adiciono RazorPagesOptions ao meu Startup.cs com um PageRoute personalizado que mapeia /robots.txt para / robotstxt. (Eu sempre achei essa API irritante, pois os parâmetros, na minha opinião, devem ser alterados para ("de", "para")), portanto, não gaste dez minutos extras, como acabei de fazer. .


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

E isso é tudo! Simples e transparente.


Você também pode adicionar o cache, se desejar, como um middleware maior ou mesmo em uma página cshtml, por exemplo


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

mas deixarei essa pequena otimização como um exercício para você.


ATUALIZAÇÃO: Quando terminei, encontrei este robots.txt de middleware e o NuGet no GitHub. Ainda estou feliz com meu código e não me importo com a ausência de dependência externa (independência externa não é importante para mim), mas é bom mantê-lo para futuras tarefas e projetos mais complexos.


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


All Articles