متوفر أيضًا بلغات أخرى: English · Español · Português · Français
قائمة ترويسات HTTP
الحقول الـ257 المسجَّلة، لكلٍّ منها الحالةُ التي يمنحها السجلّ، ومعها الشيءُ الوحيد الذي لا يدوّنه السجلّ: أيسمح المتصفح للسكربت بوضعها.
ما قائمة ترويسات HTTP؟
كلُّ طلبٍ وكلُّ ردٍّ في HTTP يحمل حقولَ ترويسة — Content-Type وCache-Control وAuthorization وسواها — وأيُّ الأسماء حقيقيٌّ ليس مسألةَ رأي. فمنظمة IANA تتولّى سجلَّ أسماء حقول HTTP، وهذه الصفحة هي ذلك السجلّ: 257 حقلًا، لكلٍّ منها الحالةُ التي منحتها إياه IANA والمواصفةُ التي جاء منها.
أكثرُ قوائم ترويسات HTTP المنشورة مرتَّبةٌ إلى ترويسات طلبٍ وترويسات ردّ. ويجدر أن تعرف أنّ السجلّ لا يحوي ذلك العمود أصلًا. فحقوله الخمسة هي الاسم والحالة والنوع المُبنيَن والمرجع وتعليقٌ حرّ — ولا شيء عن الاتجاه. ثم إنّ كثيرًا من الحقول يسير في الاتجاهين معًا، فذلك الفصلُ الذي تراه في غير هذا الموضع حكمُ محرِّرٍ يُقدَّم على أنه حقيقة.
أما ما يدوّنه السجلّ فعلًا فهو الحالة، وهو يفرّق هنا تفريقًا تطمسه الجداولُ المنسوخة. 187 حقلًا دائمة، و23 مؤقتةٌ لم تستقرّ بعد، و8 مثبَّطة، و39 مهجورة — محفوظةٌ ليُقرأ بها سيرٌ قديم لا ليستعملها الجديد. فقرابةُ خُمس السجلّ شيءٌ لا ينبغي أن ترسله.
كيف تستعملها
- ابحث بالاسم أو بالمرجع أو بالتعليق. صندوقٌ واحد يغطّي الثلاثة، والنتائج مرتَّبةٌ بالأهمية لا مُرشَّحةً وحسب: فالاسمُ المطابق يتصدّر ولو كان أبجديًّا آخرَ الترتيب، ولذلك يعطيك البحثُ عن range النتيجةَ Range لا Accept-Ranges.
- اقرأ الوسم إلى جانب كلّ اسم. يقول أيسمح المتصفح لسكربتٍ بوضع تلك الترويسة في طلب، وما يرفضه منها مؤشَّرٌ عليه بالقاعدة التي ترفضه.
- انظر عنوان الحالة فوق المجموعة. الحقولُ مجموعةٌ بحسب ما تقوله IANA عنها، فلا يجلس اسمٌ مثبَّطٌ أو مهجورٌ صامتًا إلى جانب اسمٍ معمولٍ به.
العمود الغائب، والعمود الذي يجيب فعلًا
السؤالُ الذي يأتي به الناس ليس أَترويسةُ طلبٍ هي أم ترويسةُ ردّ. بل لماذا لا يصنع وضعُها من جافاسكربت شيئًا، ودون أيّ تنبيه. وجوابُ ذلك في مواصفةٍ أخرى: فمعيار Fetch يعرّف ما يسمّيه ترويسةَ طلبٍ ممنوعة، ويطرح المتصفح أيَّ محاولةٍ لوضعها كي يظلّ ممسكًا بزمام ما يرسله.
وهي ليست قائمة. بل واحدٌ وعشرون اسمًا — Cookie وHost وOrigin وReferer وConnection وأمثالها — ومعها سابقتان: proxy- وsec-. وشطرُ السوابق هو الأطرف، لأنه بلا حدّ. فما من ترويسةٍ يبدأ اسمُها بـSec- سيستطيع كودُ الصفحة وضعَها يومًا، بما في ذلك ما لم يخترعه أحدٌ بعد، والمعيار يقول السبب: المجالُ محجوزٌ كي تُسكَّ فيه ترويساتٌ في مأمنٍ من الواجهات التي تتيح للمبرمجين ضبطَ الترويسات. وهذا بعينه ما يجعل لترويسةٍ مثل Sec-Fetch-Site قيمة: فالصفحة لا تستطيع تزويرها.
ومن أصل الحقول الـ257 المسجَّلة، 218 حقلًا مما يستطيع السكربت وضعَه، و20 مرفوضةٌ بالاسم، و19 بالسابقة. بل إنّ اسمًا واحدًا من قائمة الممنوعات ليس في السجلّ أصلًا: DNT. فالمتصفح يأبى أن يضع السكربتُ ترويسةً لم تحوها IANA قطّ.
وثمّة قاعدةٌ أصغر في الاتجاه المقابل. فالسكربت لا يستطيع أبدًا قراءة Set-Cookie ولا Set-Cookie2 من ردّ، مهما قالت ترويسات CORS، ولذلك يكون الكعكُ الذي تضعه واجهةٌ من أصلٍ آخر غيرَ مرئيٍّ للكود الذي ناداها.
حدودٌ صريحة، وثلاثةُ أمورٍ تستحق المعرفة
هذه لقطةٌ في لحظة. فالسجلّ يكسب مداخلَ جديدة، وتاريخُ قراءته مطبوعٌ تحت القائمة بدل أن يُترك لتخمينك. وأيُّ جدولٍ لا يقول متى أُخذ إنما يدّعي في صمتٍ أنه محدَّثٌ إلى الأبد.
ثم إنّ السجلّ يكتب أربعًا من حالاته بحرفٍ كبيرٍ في أولها، وأربعتها حقولُ Sec-Fetch-. فمرشِّحٌ يطابق permanent مطابقةً تامّة يعيد 183 بدل 187 ويُسقط بالضبط ترويسات الأمان الحديثة الخاصة بـfetch metadata. وهذا فخٌّ حقيقيٌّ لمن يقرأ ملفّ CSV بنفسه، ولذلك توحّد هذه الصفحة الكتابة.
ومدخلان اثنان ليسا ترويستين. فـClose ونجمةٌ مفردة مسجَّلان بتعليق reserved، أي مسجَّلان كي لا يسجّلهما أحد. وحالتُهما دائمة، فالحالةُ وحدها لن تقول لك إنهما غيرُ صالحين — ونعم، النجمةُ اسمُ حقلِ HTTP مسجَّلٌ حقًّا.
وبعضُ الأسماء التي تتوقعها غائب. فـX-Forwarded-For وX-Requested-With وX-Powered-By وX-XSS-Protection تُستعمل في كلّ مكانٍ وليست مسجَّلةً في أيّ مكان؛ وقريبُ الأول المسجَّل هو Forwarded. وفي السجلّ حقلان اثنان بالضبط يبدآن بـX-، أحدهما X-Frame-Options — مدرجًا دائمًا لا مهجورًا، وهو ما يناقض الاعتقاد الشائع بأنّ frame-ancestors في CSP قد أحاله إلى التقاعد.
وتنبيهٌ أخير على وسم قائمة CORS. فترويسةُ تلك القائمة لا تتفادى الطلبَ التمهيدي إلا مع قيمٍ بعينها: فـContent-Type تتأهّل بثلاثة أنواعِ وسائط، فـapplication/json تستدعي طلبًا تمهيديًّا وtext/plain لا تستدعيه، وكلُّ قيمةٍ في القائمة مسقوفةٌ بمئةٍ وثمانيةٍ وعشرين بايتًا. فالإدراجُ في القائمة صفةٌ للاسم والقيمة معًا، فخُذ ذلك الوسم قرينةً لا حكمًا.
لماذا هي مجانية؟
لأن تشغيلها لا يكلّف شيئًا. فالقائمة جزءٌ من الصفحة، والبحث يجري في متصفحك، ولا يُرفع شيءٌ ولا يُسجَّل.
والبياناتُ من ملفّ IANA نفسِه المقروء آليًّا لا من قائمةٍ أخرى، وقواعدُ السكربت من معيار Fetch، والبرنامجُ الذي يقرأ الاثنين محفوظٌ إلى جانب البيانات التي ينتجها كي يمكن إعادةُ إنتاج أرقام هذه الصفحة.