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

- يمكنك تنفيذ ذلك كبرنامج وسيط مضمن: فقط lambda و func و linq في سطر واحد
- يمكنك كتابة البرامج الوسيطة الخاصة بك وإجراء العديد من الخيارات ، ثم تنشيطها في بيئة env.IsStaging () أو آخر
- يمكنك إنشاء صفحة Razor واحدة مع بيئة TegHelpers
يبدو أن الخيار الأخير هو أبسط ما يعني أنه يمكنني تغيير ملف cshtml دون إعادة الترجمة تمامًا ، لذلك قمت بإنشاء Razor Page RobotsTxt.cshtml واحد. ثم استخدمت مساعد بيئة مدمجة مضمنة لإنشاء أجزاء من الملف بشكل مشروط. لاحظ أيضًا أنني أجبرت نوع mime على أن يكون نصًا / عاديًا ولا تستخدم صفحة Layout ، حيث يجب أن تكون قائمة بذاتها.
@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 "تختفي" أحيانًا (يتم حذفها) عندما تقوم بعملها ، ولكن تظل الفجوات موجودة حولها. لذلك أريد وكيل المستخدم: * أن يكون له خط ، ثم Disallow سيظهر على الفور في السطر التالي. على الرغم من أن الكود المصدري قد يكون أجمل إذا بدأ على سطر مختلف ، فسيكون الملف خاطئًا. أريد أن تكون النتيجة صحيحة. هذا لفهم:
User-agent: * Disallow: /
هذا يعطيني ملف robots.txt في / robotstxt ، لكن ليس في /robots.txt. انظر الخطأ؟ ملف Robots.txt هو ملف (مزيف) ، لذلك أحتاج إلى تعيين المسار من الطلب إلى /robots.txt إلى صفحة الشفرة المسماة RobotsTxt.cshtml.
يمكنني هنا إضافة RazorPagesOptions إلى Startup.cs الخاص بي مع PageRoute مخصص يقوم بتعيين /robots.txt إلى / robotstxt. (لقد وجدت دائمًا أن واجهة برمجة التطبيقات هذه مزعجة ، لأن المعلمات ، في رأيي ، يجب تغييرها إلى ("من" ، "إلى") ، لذا تأكد من أنك لا تقضي عشر دقائق إضافية ، كما فعلت للتو) .
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 الوسيط و NuGet على GitHub. ما زلت سعيدًا بالكود الخاص بي ولا أمانع من عدم وجود تبعية خارجية (الاستقلال الخارجي ليس مهمًا بالنسبة لي) ، لكن من الجيد الاحتفاظ به للمهام والمشاريع الأكثر تعقيدًا في المستقبل.