Saya menempatkan bagian WebForms lama dari situs saya yang masih berjalan pada bare metal ke ASP.NET Core dan Azure App Services, dan sementara saya melakukan itu saya menyadari bahwa saya ingin memastikan situs pementasan saya tidak mendapatkan diindeks oleh Google / Bing.
Saya sudah memiliki robots.txt, tapi saya ingin yang khusus untuk produksi dan yang lain khusus untuk pengembangan atau pementasan. Saya memikirkan sejumlah cara untuk menyelesaikan ini. Saya dapat memiliki robots.txt statis dan robots-staging.txt lainnya dan mengkondisikan satu sama lain selama pipa Azure DevOps CI / CD saya.
Kemudian saya menyadari hal yang paling sederhana adalah membuat robots.txt menjadi dinamis. Saya berpikir tentang menulis middleware kustom tetapi itu terdengar seperti kerumitan dan lebih banyak kode yang diperlukan. Saya ingin melihat betapa sederhananya hal ini.

- Anda bisa melakukan ini sebagai middleware sebaris tunggal, dan hanya lambda dan func dan LINQ semua itu pada satu baris
- Anda dapat menulis middleware Anda sendiri dan melakukan banyak opsi, lalu mengaktifkannya sebaik-baiknya di env.IsStaging (), dll.
- Anda dapat membuat Halaman Razor tunggal dengan tagelpers lingkungan.
Yang terakhir sepertinya paling mudah dan juga berarti saya bisa mengubah cshtml tanpa kompilasi ulang penuh, jadi saya membuat halaman pisau cukur tunggal RobotsTxt.cshtml. Tidak ada model halaman, tidak ada kode di belakang. Kemudian saya menggunakan penolong tag lingkungan bawaan untuk menghasilkan bagian file secara kondisional. Perhatikan juga bahwa saya memaksa tipe mime ke teks / polos dan saya tidak menggunakan halaman Layout, karena ini perlu berdiri sendiri.
@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>
Saya kemudian memastikan bahwa Pementasan dan / atau sistem Produksi saya memiliki variabel ASPNETCORE_ENVIRONMENT yang ditetapkan dengan tepat.

Saya juga ingin menunjukkan apa yang mungkin tampak seperti penspasian ganjil dan bagaimana beberapa teks ditabrakkan ke TagHelpers. Ingat bahwa tag TagHelper kadang-kadang "menghilang" (dihilangkan) ketika sudah selesai, tetapi ruang putih di sekitarnya tetap ada. Jadi saya ingin agen-Pengguna: * memiliki garis, dan kemudian Larang muncul segera di baris berikutnya. Walaupun mungkin kode sumber yang lebih cantik untuk memulai di baris lain, itu bukan file yang benar. Saya ingin hasilnya ketat dan yang terpenting, benar. Ini untuk pementasan:
User-agent: * Disallow: /
Ini sekarang memberi saya robots.txt di / robotstxt tetapi tidak di /robots.txt. Lihat masalahnya? Robots.txt adalah file (atau yang palsu) jadi saya perlu memetakan rute dari permintaan untuk /robots.txt ke halaman Razor yang disebut RobotsTxt.cshtml.
Di sini saya menambahkan RazorPagesOptions di Startup.cs saya dengan PageRoute kustom yang memetakan /robots.txt ke / robotstxt. (Saya selalu menemukan API ini menjengkelkan seperti seharusnya parameter, IMHO, dibalik seperti ("dari", "menjadi") jadi hati-hati untuk itu, jangan sampai Anda buang sepuluh menit seperti yang baru saja saya lakukan.
public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/robotstxt", "/Robots.Txt"); }); }
Dan itu dia! Sederhana dan bersih.
Anda juga bisa menambahkan caching jika Anda mau, baik sebagai middleware yang lebih besar, atau bahkan di Halaman cshtml, seperti
context.Response.Headers.Add("Cache-Control", $"max-age=SOMELARGENUMBEROFSECONDS");
tapi saya akan meninggalkan optimasi kecil sebagai latihan untuk pembaca.
UPDATE: Setelah saya selesai saya menemukan middleware robots.txt ini dan NuGet di GitHub. Saya masih senang dengan kode saya dan saya tidak keberatan tidak memiliki ketergantungan eksternal, tapi senang mengajukan yang ini untuk kebutuhan dan proyek yang lebih canggih di masa depan.
Bagaimana Anda menangani kebutuhan robots.txt Anda? Apakah Anda punya satu?