Secara dinamis membuat robots.txt untuk situs ASP.NET Core

Sekarang saya sedang dalam proses mentransfer beberapa WebForms lama dari situs saya, yang saat ini berjalan pada bare metal, ke layanan aplikasi ASP.NET Core dan Azure. Dalam prosesnya, saya menyadari bahwa saya ingin memastikan bahwa situs saya tidak diindeks di Google, Yandex, Bing dan mesin pencari lainnya.


Saya sudah memiliki file robots.txt, tetapi saya ingin yang satu hanya melayani untuk produksi, dan yang lainnya untuk pengembangan. Saya memikirkan beberapa cara untuk menyelesaikan masalah ini. Saya dapat memiliki file robots.txt statis, file robots-staging.txt dan dengan syarat menyalin satu di atas yang lain dalam pipa CI / CD Azure DevOps saya.


Kemudian saya menyadari bahwa hal yang paling sederhana adalah membuat robots.txt dinamis. Saya berpikir untuk menulis middleware saya sendiri, tetapi sepertinya tugas yang merepotkan dengan banyak kode. Saya ingin melihat betapa sederhananya itu.




  • Anda dapat menerapkan ini sebagai middleware tertanam: cukup lambda, func dan linq dalam satu baris
  • Anda dapat menulis middleware Anda sendiri dan membuat banyak opsi, lalu mengaktifkannya di lingkungan env.IsStaging () atau yang lain
  • Anda dapat membuat Halaman Razor tunggal dengan lingkungan TegHelpers

Opsi terakhir tampak paling sederhana dan berarti bahwa saya dapat mengubah cshtml tanpa sepenuhnya mengkompilasi ulang, jadi saya membuat Halaman Razor RobotsTxt.cshtml tunggal. Kemudian saya menggunakan penolong lingkungan yang ditandai untuk menghasilkan bagian file secara kondisional. Juga perhatikan bahwa saya memaksa tipe mime menjadi teks / polos dan tidak menggunakan halaman Layout, karena harus mandiri.


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

Kemudian saya memeriksa apakah variabel ASPNETCORE_ENVIRONMENT diatur dengan benar dalam sistem pementasan dan / atau produksi saya.


ASPNETCORE_ENVIRONMENT=Staging

Saya juga ingin menunjukkan bagaimana tampilan yang aneh dan bagaimana beberapa teks bertumpu pada TagHelpers. Ingat bahwa tag TagHelper kadang-kadang β€œmenghilang” (dihapus) ketika ia melakukan tugasnya, tetapi masih ada celah di sekitarnya. Jadi saya ingin agen-Pengguna: * memiliki garis, dan kemudian Larang akan segera muncul di baris berikutnya. Meskipun kode sumber mungkin lebih cantik jika dimulai pada baris yang berbeda, maka itu akan menjadi file yang salah. Saya ingin hasilnya benar. Ini untuk pemahaman:


 User-agent: * Disallow: / 

Ini memberi saya file robots.txt di / robotstxt, tetapi tidak di /robots.txt. Lihat kesalahannya? Robots.txt adalah file (palsu), jadi saya perlu memetakan rute dari permintaan ke /robots.txt ke halaman Razor bernama RobotsTxt.cshtml.


Di sini saya menambahkan RazorPagesOptions ke Startup.cs saya dengan PageRoute khusus yang memetakan /robots.txt ke / robotstxt. (Saya selalu menganggap API ini menjengkelkan, karena parameternya, menurut saya, harus diubah menjadi ("dari", "menjadi"), jadi pastikan Anda tidak menghabiskan sepuluh menit ekstra, seperti yang baru saja saya lakukan) .


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

Dan itu saja! Sederhana dan transparan.


Anda juga dapat menambahkan caching, jika diinginkan, sebagai middleware yang lebih besar atau bahkan pada halaman cshtml, misalnya


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

tapi saya akan meninggalkan optimasi kecil ini sebagai latihan untuk Anda.


PEMBARUAN: Ketika saya selesai, saya menemukan ini robots.txt middleware dan NuGet di GitHub. Saya masih senang dengan kode saya dan tidak keberatan tidak adanya ketergantungan eksternal (independensi eksternal tidak penting bagi saya), tetapi menyenangkan untuk menyimpannya untuk tugas dan proyek yang lebih kompleks di masa depan.


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


All Articles