HSTS: HTTP Strict Transport Security لتحسين محركات البحث

ما الذي يفعله HSTS فعليًا، وصيغة ترويسة Strict-Transport-Security (max-age، includeSubDomains، preload)، وإعادة التوجيه الداخلية للمتصفح فقط التي لا يراها الزاحفون، ولماذا لا يحل محل عمليات إعادة التوجيه 301s الخاصة بك، وكيف يمكن أن يقيّدك preload — بقلم Patrick Stox.

نُشر أول مرة: 3 يوليو 2026 · آخر تحديث: 22 أغسطس 2026 · Advanced
اللغات
دليل واحد في هذه الصفحة

HSTS (HTTP Strict Transport Security) هو رأس استجابة Strict-Transport-Security — لا يتم تكريمه إلا عند وصوله عبر اتصال آمن — يخبر المتصفح باستخدام HTTPS دائمًا لنطاقك في المستقبل، مما يسد الفجوة غير الآمنة التي يظل الطلب الأول للزائر الجديد يمر عبر HTTP قبل تشغيل إعادة التوجيه 301. إنها سياسة على مستوى المتصفح، لكل عميل، فوق عمليات إعادة التوجيه من جانب الخادم، وليست بديلاً: RFC 6797 يجعل المتصفح يعيد كتابة URI إلى HTTPS داخليًا قبل إرسال أي طلب (غالبًا ما يظهر كإعادة توجيه داخلية بنمط 307، على الرغم من أن RFC لا يفرض رمز حالة محددًا)، لذلك لا يرى الخادم أبدًا نموذج HTTP ولا يزال الزاحفون بحاجة إلى إعادة التوجيه 301 الحقيقية لفهم النقل وحمل قيمة الروابط. يحتوي الرأس على ثلاث توجيهات — max-age (مطلوب)، includeSubDomains، وpreload. يقوم preload بدمج نطاقك في المتصفح نفسه عبر hstspreload.org (يتطلب max-age لا يقل عن عام، وincludeSubDomains، وعلامة preload) وهو شبه لا رجعة فيه — الإزالة هي إرسال منفصل يستغرق شهورًا للوصول إلى المستخدمين. HSTS أيضًا صارم عمدًا: المتصفح الذي يعرفك كمضيف HSTS سيفشل بشدة دون نقرة إذا تعطلت شهادتك. لذا قم بتمكينه فقط عندما يكون HTTPS قويًا حقًا عبر كل نطاق فرعي، وتعامل مع preload كباب أحادي الاتجاه.

TL;DR — HSTS هو ترويسة الاستجابة Strict-Transport-Security، ولا يتم تكريمها إلا عندما يستقبلها المتصفح عبر اتصال آمن، ويتم تخزينها لكل عميل كسياسة مستقبلية لذلك المضيف. إنها تسد “مشكلة الطلب الأول” التي يتركها 301 وحده مفتوحة: طلب HTTP الأولي من زائر جديد غير آمن حتى يتم تشغيل إعادة التوجيه، وهذه هي النافذة التي يريدها المهاجم الذي يجرد SSL. ثلاثة توجيهات: max-age (مطلوب، بالثواني)، includeSubDomains، preload. عندما يفرض المتصفح HSTS، فإنه يعيد كتابة URI إلى HTTPS داخليًا، قبل أي طلب يصل إلى الخادم — لا يفرض RFC 6797 رمز حالة محددًا لذلك إعادة الكتابة، على الرغم من أن الأدوات غالبًا ما تعرضها كـ 307 — لذا فإن 301 من جانب الخادم لا تزال إلزامية لمحركات البحث وحقوق الارتباط؛ HSTS فوقها، وليس بدلاً منها. Preload يدمج نطاقك في المتصفح عبر hstspreload.org (يتطلب max-age ≥ 31536000، includeSubDomains، وpreload) وهو قريب من اللارجعة — الإزالة هي إرسال منفصل يستغرق شهورًا للوصول إلى المستخدمين. وHSTS مصمم للفشل الصارم عند أي خطأ في الشهادة، لذا قم بتمكينه فقط عندما يكون HTTPS قويًا عبر كل نطاق فرعي.

يقدم مركز HTTPS HSTS كحماية على مستوى المتصفح تقع فوق 301 الخاص بك. هذه الصفحة هي الغوص العميق: بناء جملة الترويسة الدقيق، إعادة التوجيه الداخلية التي تربك خبراء SEO، شبه اللارجعة لقائمة preload، والطرق الواقعية التي يقفل بها HSTS الأشخاص خارجًا.

المشكلة التي يحلها HSTS فعليًا: الطلب الأول

تخيل موقعًا تم ترحيله بشكل صحيح. كل http:// URL يعيد توجيه 301 إلى توأمه https://، الشهادة صالحة، والكنونيكالات تشير إلى HTTPS. يبدو محكمًا. ليس كذلك تمامًا.

عندما يكتب زائر جديد تمامًا yoursite.com (بدون مخطط) أو ينقر على رابط قديم http://yoursite.com، يخرج طلب المتصفح الأول عبر HTTP عادي. يجيب خادمك بـ 301، وكل طلب بعد ذلك آمن. لكن تلك الجولة الأولية الواحدة حدثت في العلن — وهذه بالضبط هي النافذة التي يريدها مهاجم تجريد SSL على نفس الشبكة. يعترضون طلب HTTP، ويبقون الضحية على HTTP بينما يمررون HTTPS إلى خادمك، ويقرؤون أو يعيدون كتابة كل شيء.

يزيل HSTS تلك النافذة لأي شخص زار من قبل. web.dev مباشر حول الآلية: “use Strict Transport Security to tell clients they should always connect to your server using HTTPS, even when following an http:// reference. This defeats attacks like SSL Stripping, and avoids the round-trip cost of the 301 redirect.” (ترجمة) «استخدم Strict Transport Security لإخبار العملاء بأنه يجب عليهم دائمًا الاتصال بخادمك باستخدام HTTPS، حتى عند اتباع مرجع http://. هذا يهزم هجمات مثل SSL Stripping، ويتجنب تكلفة الرحلة ذهابًا وإيابًا لإعادة توجيه 301.» (web.dev). تلك الجملة الأخيرة مهمة للأداء أيضًا: متصفح عائد يتخطى رحلة HTTP→HTTPS بالكامل. Evidence for this claim After receiving HSTS, a browser upgrades future HTTP attempts to HTTPS before sending the request. Scope: MDN documents user-agent enforcement after the header has been learned; first-visit protection requires preload or a prior secure visit. Confidence: high · Verified: MDN: Strict-Transport-Security header

شرطان حدوديان يستحقان الدقة. أولاً، HSTS هو سياسة مخزنة لكل عميل — تعيش في حالة ذلك المتصفح الواحد لهذا المضيف، المستفادة من ترويسة تم تسليمها عبر اتصال آمن؛ نفس الترويسة المرسلة على استجابة HTTP يتم تجاهلها تمامًا (المهاجم الذي يمكنه حقن أو تجريد الترويسات على HTTP عادي يمكنه بخلاف ذلك تحييدها)، والعميل الذي لم يستقبلها أبدًا — تثبيت جديد، متصفح مختلف، زاحف — ليس لديه سياسة لفرضها. ثانيًا، إعادة الكتابة واعية بالمخطط والمنفذ: طلب منفذ 80 ضمني يصبح طلب منفذ 443 ضمني، ولكن إذا كان URI الأصلي يسمي منفذًا صريحًا غير افتراضي، يحتفظ المتصفح بنفس رقم المنفذ ويتصل به ببساطة عبر HTTPS بدلاً من ذلك.

بناء جملة الترويسة

HSTS هو ترويسة استجابة واحدة تحتوي على ما يصل إلى ثلاثة توجيهات. وفقًا MDN، الأشكال هي:

Strict-Transport-Security: max-age=31536000
Strict-Transport-Security: max-age=31536000; includeSubDomains
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  • max-age=<seconds> — مطلوب. “الوقت، بالثواني، الذي يجب أن يتذكره المتصفح أن المضيف لا يمكن الوصول إليه إلا عبر HTTPS” (MDN). 31536000 هي سنة واحدة؛ 63072000 هي سنتان. الساعة تُعاد ضبطها عند كل استجابة تحمل الترويسة، لذا فإن الموقع النشط يجدد سياسته باستمرار. هذه حالة نسبية خاصة بكل عميل: إزالة الترويسة ببساطة لا تمسحها فورًا — المتصفح الذي تعلم السياسة بالفعل يستمر في تطبيقها حتى تنتهي مدة max-age المخزنة لديه. لإيقاف تشغيل HSTS للعملاء الذين تعلموها بالفعل، يجب عليك تقديم max-age=0 بنشاط عبر استجابة آمنة؛ عندها ينسى المتصفح السياسة في زيارته الآمنة التالية. (max-age=0 تمسح سياسة متعلمة فقط — لا تزيل نطاقًا من قائمة التحميل المسبق المنفصلة.)
  • includeSubDomains — اختياري. “إذا تم تحديد هذا التوجيه، تنطبق سياسة HSTS على جميع النطاقات الفرعية لنطاق المضيف أيضًا” (MDN). قوي وخطير بنفس القدر — انظر سيناريوهات الإغلاق أدناه.
  • preload — اختياري. علامة تشير إلى نيتك في أن تكون ضمن قائمة التحميل المسبق للمتصفح. لا تفعل شيئًا بمفردها؛ إنها شرط أساسي للتقديم إلى hstspreload.org. Evidence for this claim HSTS preload requires at least a one-year max-age, includeSubDomains, and preload; removal can take months to reach users. Scope: The Chromium preload service documents submission and removal behavior; requirements can change and should be rechecked before submission. Confidence: high · Verified: Chromium: HSTS Preload List Submission

السلوك، مرة أخرى من MDN: “قبل تحميل عنوان http URL، يتحقق المتصفح من اسم النطاق مقابل قائمة مضيفي HSTS. إذا كان اسم النطاق مطابقًا غير حساس لحالة الأحرف لمضيف HSTS أو كان نطاقًا فرعيًا لمضيف حدد includeSubDomains، فإن المتصفح يستبدل مخطط URL بـ https.”

الترقية الداخلية التي لا يراها الزاحفون أبدًا (هذا هو جوهر SEO)

إليك أكثر شيء يساء فهمه حول HSTS، والسبب الذي يجعله لا يمكن أن يحل محل عمليات إعادة التوجيه الخاصة بك.

عندما يقوم المتصفح بترقية طلب http:// تحت HSTS، فإنه يعيد كتابة URI إلى HTTPS داخليًا، قبل إجراء أي طلب شبكة — يتطلب RFC 6797 استبدال المخطط نفسه ولكنه لا يفرض رمز حالة معينًا له (RFC 6797 §8.3)، لذا قد يمثل متصفح أو أداة زحف معينة تلك الخطوة الداخلية كما يحلو لها — يعرضها الكثيرون كـ 307 داخلي، لكن هذا خاص بالعميل/الأداة، وليس ضمانًا بروتوكوليًا. ما يهم لتحسين محركات البحث أبسط ويظل صحيحًا بغض النظر عن التسمية: لا يتم الاتصال بالخادم لإصدار HTTP، لذا لا يراه أي زاحف أبدًا. لا يحمل Googlebot و Bingbot سياسة HSTS متعلمة بالطريقة التي يحملها Chrome البشري العائد — يصلون إلى خادمك من جديد، وما يحتاجون إلى رؤيته هناك هو 301 حقيقي من جانب الخادم. Evidence for this claim RFC 6797 requires the user agent to rewrite a known-HSTS-host HTTP URI to HTTPS internally, but does not mandate any specific redirect status code for that internal rewrite; how a given browser or crawling tool represents that step (e.g., as an internal 307) is a client/tool implementation detail, not a protocol requirement. Scope: RFC 6797 Section 8.3 ("URI Loading and Port Mapping") specifies the UA MUST replace the URI scheme with https; it does not prescribe an HTTP status code for that internal substitution, since no HTTP exchange occurs for it. Section 7.2's suggestion of status code 301 addresses ordinary server-side redirect behavior, not this internal client-side rewrite. Confidence: high · Verified: RFC 6797 §8.3 — URI Loading and Port Mapping

لذا فإن القاعدة واضحة: HSTS لا يحل محل عمليات إعادة التوجيه 301 من جانب الخادم. الـ 301 هو ما تستخدمه محركات البحث لفهم انتقال البروتوكول وتوحيد الإشارات (“301 and other permanent redirects don’t cause a loss in PageRank” (ترجمة) «عمليات 301 وغيرها من عمليات إعادة التوجيه الدائمة لا تسبب فقدان PageRank» المصدر، وفقًا لجوجل). الترقية الداخلية للمتصفح فقط هي طبقة تجربة المستخدم والأمان فوق ذلك. تحتاج إلى كليهما، يقومان بمهام مختلفة:

  • 301 (من جانب الخادم): للزاحفين والفهرسة وحقوق الارتباط.
  • ترقية داخلية بنمط 307 (من جانب المتصفح، من HSTS): للبشر العائدين وحماية من تجريد SSL — تمثيل الحالة الدقيق يختلف حسب العميل/الأداة.

أي دليل يخبرك أن HSTS “يتعامل مع إعادة التوجيه بحيث يمكنك التخلي عن 301 الخاص بك” هو خطأ بطريقة ستكلفك بهدوء.

HSTS preload: النسخة شبه الدائمة

max-age يحمي الزوار العائدين، لكنه يعاني من مشكلة التمهيد: الزائر لأول مرة الذي لم يستلم رأسك بعد لا يزال معرضًا للخطر في ذلك الطلب الأولي. Preload يحل هذه المشكلة عن طريق ترميز نطاقك في مصدر المتصفح نفسه، بحيث يعرف المتصفح أنك HTTPS فقط قبل أن يتصل بك أبدًا.

يمكنك الاشتراك في hstspreload.org. المتطلبات دقيقة:

  1. “Serve a valid certificate.” (ترجمة) «قدّم شهادة صالحة.»
  2. “Redirect from HTTP to HTTPS on the same host, if you are listening on port 80.” (ترجمة) «أعد التوجيه من HTTP إلى HTTPS على نفس المضيف، إذا كنت تستمع على المنفذ 80.»
  3. “Serve all subdomains over HTTPS” (ترجمة) «قدّم جميع النطاقات الفرعية عبر HTTPS» — بما في ذلك على وجه الخصوص النطاق الفرعي www إذا كان سجل DNS موجودًا.
  4. على استجابة HTTPS للنطاق الأساسي، رأس HSTS حيث “the max-age must be at least 31536000 seconds (1 year),” (ترجمة) «يجب أن يكون max-age على الأقل 31536000 ثانية (سنة واحدة)،» “the includeSubDomains directive must be specified,” (ترجمة) «يجب تحديد توجيه includeSubDomains،» و “the preload directive must be specified.” (ترجمة) «يجب تحديد توجيه preload.» (hstspreload.org)

لهذا السبب فإن المثال السابق لمدة عامين (max-age=63072000; includeSubDomains; preload) هو الشكل الذي يقدمه الأشخاص — لاحظ أن هذه هي متطلبات التقديم الدقيقة كما نشرتها hstspreload.org؛ تعامل معها كمعيار حالي، وليس ثابتًا دائمًا، وأعد التحقق من الصفحة الحية قبل التقديم.

من المفيد التمييز بين أربع حالات مختلفة، لأن الناس يخلطون بينها باستمرار:

الحالةما هو صحيح فعليًا
الرمز موجوديتضمن رأسك preload. هذا مجرد علامة — لا يفعل شيئًا بحد ذاته ولا يضعك في أي قائمة.
مؤهليلبي موقعك جميع متطلبات hstspreload.org الأربعة أعلاه (الشهادة، إعادة التوجيه، النطاقات الفرعية، شكل الرأس). لا يزال غير مدرج في القائمة.
مُقدَّم / قيد الانتظارلقد قدمت في hstspreload.org وهو في قائمة الانتظار للإدراج في إصدار متصفح قادم. لم يتم تطبيقه بعد للمستخدمين الحقيقيين.
مدرج فعليًاالنطاق مدمج في إصدار المُصدَّر لمتصفح معين. التطبيق موجود فقط للمستخدمين على هذا الإصدار — الطرح ليس فوريًا أو عالميًا عبر المتصفحات.

الإزالة تعمل بنفس الحالات الأربع بالعكس، وببطء مماثل: إزالة توجيه preload من رأسك يجعلك مؤهلاً لنموذج الإزالة، ثم يكون التقديم قيد الانتظار، ويظل النطاق مفروضًا لأي مستخدم على إصدار متصفح لا يزال يشحنه — حتى يخرج هذا الإصدار من التداول.

الآن الجزء الذي يحول preload إلى باب ذو اتجاه واحد. من موقع التقديم نفسه: “Be aware that inclusion in the preload list cannot easily be undone. Domains can be removed, but it takes months for a change to reach users with a Chrome update and we cannot make guarantees about other browsers.” (ترجمة) «كن على علم بأن الإدراج في قائمة preload لا يمكن التراجع عنه بسهولة. يمكن إزالة النطاقات، لكن يستغرق شهورًا حتى يصل التغيير إلى المستخدمين مع تحديث Chrome ولا يمكننا تقديم ضمانات بشأن المتصفحات الأخرى.» (hstspreload.org). ونصيحته الخاصة: “Don’t request inclusion unless you’re sure that you can support HTTPS for your entire site and all its subdomains in the long term.” (ترجمة) «لا تطلب الإدراج إلا إذا كنت متأكدًا من أنك تستطيع دعم HTTPS لموقعك بالكامل وجميع نطاقاته الفرعية على المدى الطويل.»

الترجمة العملية: preload هو وضع أمان رائع حقًا، لكن إذا احتجت يومًا إلى تقديم أي شيء — نطاق فرعي قديم، علامة تجارية مستحوذة، أداة داخلية — عبر HTTP عادي مرة أخرى، فستظل عالقًا في انتظار دورات إصدار المتصفح للوصول إلى كل مستخدم. يضع دليل Kinsta الواقع التشغيلي بوضوح: يمكن أن تكون عملية إزالة نطاقك صعبة وتستغرق وقتًا طويلاً. تعامل مع preload على أنه دائم.

لماذا صُمم HSTS ليكون مؤلمًا عند حدوث الأعطال

صرامة HSTS ليست خطأ — إنها الضمانة الأمنية بأكملها. يوضح web.dev المقايضة: “Clients that have listed your site as a known HSTS Host are likely to hard-fail if your site ever has an error in its TLS configuration, (such as an expired certificate). HSTS is explicitly designed this way to ensure that network attackers can’t trick clients into accessing the site without HTTPS.” (ترجمة) «من المرجح أن يفشل العملاء الذين أدرجوا موقعك كمضيف HSTS معروف بشدة إذا حدث خطأ في تكوين TLS الخاص بموقعك (مثل شهادة منتهية الصلاحية). تم تصميم HSTS بهذه الطريقة صراحةً لضمان عدم تمكن المهاجمين عبر الشبكة من خداع العملاء للوصول إلى الموقع بدون HTTPS.» (web.dev).

الاستنتاج الذي توصلت إليه Google هو الجملة التي سأكتبها على جبين أي شخص على وشك تفعيل هذا: “Don’t enable HSTS until you’re certain your site operation is robust enough to avoid ever deploying HTTPS with certificate validation errors.” (ترجمة) «لا تقم بتمكين HSTS حتى تتأكد من أن تشغيل موقعك قوي بما يكفي لتجنب نشر HTTPS مع أخطاء التحقق من الشهادة.» (web.dev).

“الفشل الصارم” يعني ذلك تمامًا: لا يوجد رابط “المتابعة على أي حال”، لا نقرة للمتابعة. في صفحة HTTPS عادية، تظهر شهادة منتهية الصلاحية نافذة تحذير مخيفة يمكن للمستخدم المصمم تجاوزها. على مضيف HSTS، يرفض المتصفح ذلك تمامًا. لذا يتغير نمط الفشل عند تفويت تجديد الشهادة — من “انخفاض حركة المرور لأن الناس يخافون” إلى “الموقع غير قابل للوصول لكل زائر عائد.”

سيناريوهات الإغلاق الواقعية

الطرق التي يعض بها HSTS في الممارسة العملية تعود دائمًا تقريبًا إلى includeSubDomains أو التحميل المسبق الذي يتقدم على تغطية HTTPS الفعلية الخاصة بك:

  • النطاق الفرعي المنسي. قمت بتعيين includeSubDomains على example.com، لكن legacy.example.com (تطبيق قديم، صفحة حالة، أداة بائع) يتحدث HTTP فقط أو لديه شهادة لا تغطيه. كل متصفح رأى الترويسة يرفض الآن تحميل هذا النطاق الفرعي. لم يتغير شيء على ذلك الخادم — وصلت السياسة إليه وكسرته.
  • فجوة الشهادة البدل. تغطي شهادة البدل *.example.com نطاق foo.example.com لكن ليس foo.bar.example.com (البدل هو مستوى واحد من تسمية DNS). إذا كان نطاق فرعي أعمق يعتمد على HTTP أو شهادة غير متطابقة، فإن includeSubDomains يقفله.
  • الشهادة منتهية الصلاحية على مضيف HSTS. يفشل أتمتة التجديد، تنتهي صلاحية الشهادة، وبدلاً من تحذير يمكن تجاوزه تحصل على موقع معطل لكل من يتذكر متصفحه سياستك — حتى تحصل على شهادة صالحة و يعيدون الاتصال ويتلقون استجابة آمنة جديدة. لا يوجد تجاوز أسرع.
  • ندم التحميل المسبق. قمت بالتحميل المسبق، ثم تتطلب حاجة عمل خدمة HTTP فقط تحت النطاق. التراجع عن ذلك هو وظيفتان منفصلتان غير فوريتين، وليس واحدة: تقديم max-age=0 عبر HTTPS يمسح فقط السياسة المتعلمة للعملاء الذين يعيدون الاتصال قبل انتهاء صلاحية max-age القديمة على أي حال، بينما إخراج النطاق من قائمة التحميل المسبق هو إرسال منفصل لا يزال يستغرق دورات إصدار المتصفح — أشهر — للوصول إلى المستخدمين، بغض النظر عن أي شيء تغيره على خادمك.
  • تصادمات التطوير المحلي / التدريج. يمكن أن يؤدي التحميل المسبق لـ example.com مع includeSubDomains إلى جعل dev.example.com أو مضيف داخلي بنمط localhost تحت نفس النطاق الأعلى يرفض HTTP، مما يكسر سير العمل المحلي بطرق مفاجئة.

لا شيء من هذه أسباب لتجنب HSTS. إنها أسباب لتدرجه: max-age قصير أولاً، أضف includeSubDomains فقط بعد تدقيق كل نطاق فرعي، واحتفظ بـ preload عندما تكون متأكدًا.

HSTS ليس لعبة ترتيب (ولا يلمس التوحيد القياسي)

لتوضيح الأمر من منظور تحسين محركات البحث (SEO): لا يُعد HSTS إشارة ترتيب. HTTPS نفسه هو إشارة صغيرة عمدًا — وصفته Google بأنه “إشارة خفيفة جدًا” تؤثر على أقل من 1% من الاستعلامات — وHSTS هو طبقة فوق HTTPS، وليس مدخل ترتيب منفصل. كما أنه لا يتحكم مباشرة في التوحيد القياسي أو الفهرسة. توثيق Google الخاص أكثر تحديدًا من عبارة “لا يهم” المسطحة، لكن: Google تفضل HTTPS كمعيار أساسي على صفحة HTTP مكافئة إلا عند وجود شهادة غير صالحة، أو تبعيات صفحة غير آمنة، أو صفحة HTTPS تعيد التوجيه إلى HTTP، أو وسم rel="canonical" من HTTP (Google: دمج عناوين URL المكررة). لا يمكن لـ HSTS إصلاح أو تجاوز أي من ذلك. إنها سياسة من جانب المتصفح دون أي تأثير على منطق التوحيد القياسي في Google — يمكن لشهادة سيئة أو سلسلة إعادة توجيه مكسورة أن تدفع Google نحو معيار HTTP بغض النظر عن ما يقوله رأس HSTS الخاص بك. التوحيد القياسي مدفوع بروابط 301 الخاصة بك، وشهادتك، ووسم rel="canonical"، وروابطك الداخلية — يكسب HSTS مكانه لـ الأمان، وثقة المستخدم، وسد فجوة تجريد SSL — افعل ذلك لهذه الأسباب، وحافظ على روابط 301 والشهادة قوية حقًا، ولن ترى HSTS نفسه أبدًا في تقرير ترتيب في أي من الاتجاهين.

إذا كنت تنفذ انتقال HTTP→HTTPS الأوسع، فإن HSTS هو آخر شيء تقوم بتشغيله، وليس الأول — فهو يأتي بعد استقرار عملية الترحيل، كجزء من انضباط ترحيل الموقع الأوسع.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.