Erstellen Sie dynamisch robots.txt für ASP.NET Core-Sites

Jetzt bin ich dabei, einige der alten WebForms meiner Site, die bisher auf Bare-Metal-Basis ausgeführt wurden, auf ASP.NET Core- und Azure-Anwendungsdienste zu übertragen. Dabei wurde mir klar, dass ich sicherstellen möchte, dass meine Websites nicht in Google, Yandex, Bing und anderen Suchmaschinen indiziert sind.


Ich habe bereits eine robots.txt-Datei, aber ich möchte, dass eine nur für die Produktion und die andere für die Entwicklung dient. Ich dachte über verschiedene Möglichkeiten nach, um dieses Problem zu lösen. Ich könnte eine statische robots.txt-Datei und eine robots-staging.txt-Datei haben und diese in meiner Azure DevOps CI / CD-Pipeline bedingt übereinander kopieren.


Dann wurde mir klar, dass es am einfachsten ist, robots.txt dynamisch zu machen. Ich dachte daran, meine eigene Middleware zu schreiben, aber es schien eine mühsame Aufgabe mit viel Code zu sein. Ich wollte sehen, wie einfach es sein kann.




  • Sie können dies als eingebettete Middleware implementieren: nur Lambda, Funk und Linq in einer Zeile
  • Sie können Ihre eigene Middleware schreiben, viele Optionen auswählen und sie dann in einer Umgebung env.IsStaging () oder einer anderen aktivieren
  • Sie können eine einzelne Rasiermesserseite mit einer TegHelpers-Umgebung erstellen

Die letzte Option schien die einfachste zu sein und bedeutete, dass ich cshtml ändern konnte, ohne sie vollständig neu zu kompilieren. Deshalb habe ich eine einzelne Razor Page RobotsTxt.cshtml erstellt. Dann habe ich den integrierten Umgebungs-Helfer mit Tags verwendet, um Teile der Datei bedingt zu generieren. Beachten Sie auch, dass ich den MIME-Typ als Text / Plain erzwungen habe und die Layout-Seite nicht verwende, da sie in sich geschlossen 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> 

Dann überprüfe ich, ob die Variablen ASPNETCORE_ENVIRONMENT auf meinen Staging- und / oder Produktionssystemen richtig eingestellt sind.


ASPNETCORE_ENVIRONMENT=Staging

Ich möchte auch darauf hinweisen, wie ein ungerader Abstand aussehen könnte und wie ein Teil des Textes auf TagHelpers ruht. Denken Sie daran, dass das TagHelper-Tag manchmal „verschwindet“ (gelöscht wird), wenn es seine Arbeit erledigt, aber Lücken bleiben um es herum. Ich möchte also, dass der User-Agent: * eine Zeile hat, und dann wird Disallow sofort in der nächsten Zeile angezeigt. Obwohl der Quellcode hübscher sein kann, wenn er in einer anderen Zeile beginnt, handelt es sich um die falsche Datei. Ich möchte, dass das Ergebnis korrekt ist. Dies dient dem Verständnis:


 User-agent: * Disallow: / 

Dies gibt mir die robots.txt-Datei in / robotstxt, aber nicht in /robots.txt. Sehen Sie den Fehler? Robots.txt ist eine (gefälschte) Datei, daher muss ich die Route von der Anforderung zu /robots.txt der Razor-Seite mit dem Namen RobotsTxt.cshtml zuordnen.


Hier füge ich RazorPagesOptions zu meiner Startup.cs mit einer benutzerdefinierten PageRoute hinzu, die /robots.txt in / robotstxt anzeigt. (Ich fand diese API immer ärgerlich, da die Parameter meiner Meinung nach in ("von", "bis") geändert werden sollten. Stellen Sie also sicher, dass Sie nicht wie oben zehn zusätzliche Minuten verbringen.) .


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

Und das ist alles! Einfach und transparent.


Sie können Caching auch hinzufügen, wenn Sie möchten, beispielsweise als größere Middleware oder sogar auf einer cshtml-Seite


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

Aber ich werde diese kleine Optimierung als Übung für Sie belassen.


UPDATE: Als ich fertig war, fand ich diese Middleware robots.txt und NuGet auf GitHub. Ich bin immer noch zufrieden mit meinem Code und habe nichts gegen das Fehlen externer Abhängigkeit (externe Unabhängigkeit ist mir nicht wichtig), aber es ist schön, ihn für zukünftige komplexere Aufgaben und Projekte aufzubewahren.


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


All Articles