أضع جزءًا من أجزاء WebForm القديمة من موقعي التي لا تزال تعمل على المعدن العاري لـ ASP.NET Core و Azure App Services ، وبينما أفعل ذلك أدركت أنني أريد أن أتأكد من عدم الحصول على مواقع التدريج الخاصة بي فهرستها من قبل جوجل / بنج.
لديّ بالفعل ملف robots.txt ، لكنني أريد واحدة خاصة بالإنتاج وأخرى خاصة بالتطوير أو التدريج. فكرت في عدد من الطرق لحل هذا. يمكن أن يكون لدي ملف robots.txt ثابت وآخر robots-staging.txt ونسخ واحدًا مشروطًا على الآخر أثناء خط أنابيب Azure DevOps CI / CD.
ثم أدركت أن أبسط شيء ممكن هو جعل ملف robots.txt ديناميكيًا. فكرت في كتابة برامج وسيطة مخصصة ولكن بدا الأمر وكأنه رمز أكثر من المتاعب التي تحتاجها. أردت أن أرى مدى بساطة هذا الأمر.

- يمكنك القيام بذلك كوسيطة واحدة مضمّنة ، وفقط lambda و func و linq ، يمكنك التحقق من ذلك كله على سطر واحد
- يمكنك كتابة البرامج الوسيطة الخاصة بك والقيام بالكثير من الخيارات ، ثم تفعيلها على env.IsStaging () ، إلخ.
- يمكنك إنشاء صفحة حلاقة واحدة مع علامات تمييز البيئة.
بدا آخرها أسهل وسيعني أيضًا أنه يمكنني تغيير ملف cshtml دون إعادة ترجمة كاملة ، لذا قمت بإنشاء صفحة حلاقة واحدة من RobotsTxt.cshtml. لا يوجد نموذج للصفحة ، ولا يوجد كود خلفه. ثم استخدمت مساعد علامة البيئة المضمّن لإنشاء أجزاء من الملف بشكل مشروط. لاحظ أيضًا أنني أجبرت نوع mime على الكتابة / النص العادي ولا أستخدم صفحة "تخطيط" ، حيث يجب أن يكون ذلك قائمًا بذاته.
@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>
أتأكد بعد ذلك من أن أنظمة التدريج و / أو الإنتاج الخاصة بي تحتوي على متغيرات ASPNETCORE_ENVIRONMENT مضبوطة بشكل مناسب.

أريد أيضًا أن أشير إلى ما قد يبدو مثل التباعد الفردي وكيف يتم إخماد بعض النصوص مقابل TagHelpers. تذكر أن علامة TagHelper في بعض الأحيان "تختفي" (هي elided) عندما تنتهي من عملها ، لكن يبقى مسافة حولها. لذلك أريد وكيل المستخدم: * أن يكون له خط ، ثم عدم السماح له بالظهور على الفور في السطر التالي. على الرغم من أنه قد يكون من أجمل شفرة المصدر أن تبدأ في سطر آخر ، إلا أنها ليست ملفًا صحيحًا في ذلك الوقت. أريد أن تكون النتيجة ضيقة وقبل كل شيء صحيحة. هذا لانطلاق:
User-agent: * Disallow: /
هذا يعطيني الآن ملف robots.txt في / robotstxt ولكن ليس في /robots.txt. انظر القضية؟ ملف Robots.txt هو ملف (أو ملف مزيف) ، لذا أحتاج إلى تعيين مسار من طلب /robots.txt إلى صفحة الشفرة المسماة RobotsTxt.cshtml.
يمكنني هنا إضافة RazorPagesOptions في Startup.cs الخاص بي مع PageRoute مخصص يقوم بتعيين /robots.txt إلى / robotstxt. (لقد وجدت دائمًا أن واجهة برمجة التطبيقات هذه مزعجة لأن المعلمات يجب ، IMHO ، عكسها مثل ("من" ، "إلى") لذا احترس من ذلك ، خشية أن تضيع عشر دقائق كما فعلت.
public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/robotstxt", "/Robots.Txt"); }); }
وهذا كل شيء! بسيطة ونظيفة.
يمكنك أيضًا إضافة ذاكرة التخزين المؤقت إذا أردت ، إما كوسيطة أكبر ، أو حتى في صفحة cshtml ، مثل
context.Response.Headers.Add("Cache-Control", $"max-age=SOMELARGENUMBEROFSECONDS");
ولكن سأترك هذا التحسين الصغير كتمرين للقارئ.
حدث: بعد أن انتهيت ، وجدت هذه الأداة الوسيطة لـ robots.txt وأرسلت برنامج GitHub. ما زلت سعيدًا بالشفرة الخاصة بي ولا مانع من عدم وجود تبعية خارجية ، لكن من الجيد أن أقوم بتقديمها بعيدًا لاحتياجات ومشاريع أكثر تطوراً في المستقبل.
كيف تتعامل مع احتياجاتك في ملف robots.txt؟ هل لديك واحدة حتى؟