Ich stelle einen Teil älterer WebForms-Teile meiner Website, die noch auf Bare-Metal-Basis ausgeführt werden, für ASP.NET Core und Azure App Services bereit. Dabei wurde mir klar, dass ich sicherstellen möchte, dass meine Staging-Websites nicht funktionieren indiziert von Google / Bing.
Ich habe bereits eine robots.txt, aber ich möchte eine, die spezifisch für die Produktion ist, und andere, die spezifisch für die Entwicklung oder Inszenierung sind. Ich dachte über eine Reihe von Möglichkeiten nach, um dies zu lösen. Ich könnte eine statische robots.txt und eine andere robots-staging.txt haben und während meiner Azure DevOps CI / CD-Pipeline bedingt übereinander kopieren.
Dann wurde mir klar, dass es am einfachsten wäre, robots.txt einfach dynamisch zu machen. Ich dachte darüber nach, benutzerdefinierte Middleware zu schreiben, aber das klang nach Ärger und mehr Code, der benötigt wurde. Ich wollte sehen, wie einfach das sein kann.

- Sie können dies als einzelne Inline-Middleware tun und einfach nur Lambda und Funk und Linq zum Teufel in einer Zeile
- Sie können Ihre eigene Middleware schreiben und viele Optionen ausführen und sie dann am besten auf env.IsStaging () usw. aktivieren.
- Sie können eine einzelne Rasiermesserseite mit Tag-Helfern für die Umgebung erstellen.
Das letzte schien am einfachsten zu sein und würde auch bedeuten, dass ich das cshtml ohne eine vollständige Neukompilierung ändern könnte, also habe ich eine RobotsTxt.cshtml-Rasiermesserseite erstellt. Kein Seitenmodell, kein Code dahinter. Dann habe ich den integrierten Umgebungs-Tag-Helfer verwendet, um Teile der Datei bedingt zu generieren. Beachten Sie auch, dass ich den MIME-Typ auf Text / Plain gezwungen habe und keine Layout-Seite verwende, da diese eigenständig sein muss.
@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>
Ich stelle dann sicher, dass auf meinen Staging- und / oder Produktionssystemen die Variablen ASPNETCORE_ENVIRONMENT entsprechend eingestellt sind.

Ich möchte auch darauf hinweisen, was wie ungerade Abstände aussehen kann und wie Text gegen die TagHelpers gestoßen wird. Denken Sie daran, dass das Tag eines TagHelper manchmal "verschwindet" (entfernt wird), wenn es seine Sache erledigt hat, aber das Leerzeichen um es herum bleibt. Ich möchte also, dass User-Agent: * eine Zeile hat und Disallow sofort in der nächsten Zeile angezeigt wird. Es ist zwar schöner, wenn der Quellcode in einer anderen Zeile beginnt, aber dann ist es keine korrekte Datei. Ich möchte, dass das Ergebnis knapp und vor allem korrekt ist. Dies ist für die Inszenierung:
User-agent: * Disallow: /
Dies gibt mir jetzt eine robots.txt unter / robotstxt, aber nicht unter /robots.txt. Sehen Sie das Problem? Robots.txt ist eine Datei (oder eine gefälschte), daher muss ich der Razor-Seite RobotsTxt.cshtml eine Route von der Anforderung für /robots.txt zuordnen.
Hier füge ich eine RazorPagesOptions in meiner Startup.cs mit einer benutzerdefinierten PageRoute hinzu, die /robots.txt / robotstxt zuordnet. (Ich fand diese API immer ärgerlich, da die Parameter meiner Meinung nach umgekehrt werden sollten ("von", "nach"). Achten Sie also darauf, damit Sie nicht zehn Minuten verschwenden, wie ich es gerade getan habe.
public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/robotstxt", "/Robots.Txt"); }); }
Und das war's! Einfach und sauber.
Sie können auch Caching hinzufügen, wenn Sie möchten, entweder als größere Middleware oder sogar auf der cshtml-Seite, wie z
context.Response.Headers.Add("Cache-Control", $"max-age=SOMELARGENUMBEROFSECONDS");
aber ich überlasse diese kleine Optimierung dem Leser als Übung.
UPDATE: Nachdem ich fertig war, fand ich diese robots.txt Middleware und NuGet auf GitHub. Ich bin immer noch zufrieden mit meinem Code und es macht mir nichts aus, keine externe Abhängigkeit zu haben, aber es ist schön, diese für zukünftige anspruchsvollere Anforderungen und Projekte abzulegen.
Wie gehen Sie mit Ihren robots.txt-Anforderungen um? Hast du überhaupt einen?