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.

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.