تعد رؤوس HTTP مهمة للتحكم في كيفية معالجة ذاكرة التخزين المؤقت والمتصفحات للمحتوى الخاص بك. ولكن يتم استخدام العديد منها بشكل غير صحيح أو بلا معنى ، وتنفق موارد إضافية في لحظة حرجة من تحميل الصفحة ، وقد لا تعمل كما تظن. في سلسلة من المقالات حول أفضل الممارسات ، سنلقي نظرة أولاً على العناوين غير الضرورية.
يدرك معظم المطورين رؤوس HTTP المهمة والمفيدة. الأكثر شهرة هي
Content-Type
Content-Length
، وهي رؤوس عامة تقريبًا. ولكن في الآونة الأخيرة ، تم استخدام رؤوس مثل
Content-Security-Policy
و
Strict-Transport-Security
لزيادة
Strict-Transport-Security
، و
Link rel=preload
لتحسين الأداء. على الرغم من الدعم الواسع في المتصفحات ، إلا أن القليل منهم يستخدمونها.
في الوقت نفسه ، هناك العديد من العناوين الشائعة للغاية التي ليست جديدة وغير مفيدة بشكل عام. يمكننا إثبات ذلك بمساعدة
أرشيف HTTP ، وهو مشروع تديره Google وبرعاية Fastly ، والذي يقوم بتنزيل 500000 موقع كل شهر باستخدام
WebPageTest ويحمل النتائج إلى
BigQuery .
فيما يلي أكثر 30 رأس استجابة شيوعًا وفقًا لأرشيف HTTP (بناءً على عدد المجالات في الأرشيف التي يعرضها كل رأس) ، وتقدير تقريبي لفائدة كل منها:
العنوان | استفسارات | المجالات | الحالة |
---|
التاريخ | 48779277 | 535621 | بروتوكول مطلوب |
نوع المحتوى | 47185627 | 533636 | عادة ما يطلبه المتصفح |
الخادم | 43057807 | 519663 | اختياري |
طول المحتوى | 42388435 | 519118 | مفيد |
التعديل الأخير | 34424562 | 480294 | مفيد |
التحكم في التخزين المؤقت | 36490878 | 412943 | مفيد |
etag | 23620444 | 412370 | مفيد |
ترميز المحتوى | 16194121 | 409159 | مطلوب للمحتوى المضغوط |
تنتهي الصلاحية | 29869228 | 360311 | اختياري |
مدعوم من قبل | 4883204 | 211409 | اختياري |
براغما | 7641647 | 188784 | اختياري |
خيارات x-frame | 3670032 | 105846 | اختياري |
الوصول - التحكم - السماح - الأصل | 11335681 | 103596 | مفيد |
x-content-type-options | 11071560 | 94590 | مفيد |
رابط | 1212329 | 87475 | مفيد |
العمر | 7401415 | 59242 | مفيد |
س ذاكرة التخزين المؤقت | 5275343 | 56889 | اختياري |
حماية x-xss | 9773906 | 51810 | مفيد |
أمن النقل الصارم | 4259121 | 51283 | مفيد |
عبر | 4020117 | 47102 | اختياري |
ص 3 | 8282840 | 44308 | اختياري |
نتوقع ct | 2685280 | 40465 | مفيد |
لغة المحتوى | 334081 | 37927 | مثير للجدل |
x-aspnet-version | 676128 | 33473 | اختياري |
الوصول - التحكم - السماح - أوراق الاعتماد | 2804382 | 30346 | مفيد |
علامة x-robots-tag | 179177 | 24911 | لا يهم المتصفحات |
متوافق مع x-ua | 489056 | 24811 | اختياري |
طرق التحكم في الوصول | 1626129 | 20791 | مفيد |
التحكم في الوصول - السماح - رؤوس | 1205735 | 19120 | مفيد |
دعونا نلقي نظرة على العناوين الاختيارية ، ولماذا لا نحتاجها ، وماذا نفعل حيال ذلك.
الغرور (الخادم ، مدعوم من قبل ، عبر)
يمكنك أن تكون فخورًا جدًا باختيارك لبرنامج الخادم ، ولكن معظم الناس لا يهتمون بذلك. في أسوأ الحالات ، قد تكشف هذه الرؤوس عن البيانات الحساسة ، مما يسهل مهاجمة موقعك.
Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid
يسمح لك
RFC7231 بتضمين رأس الخادم في استجابة الخادم ، مما يشير إلى البرنامج المحدد على الخادم الذي يتم استخدامه لتسليم المحتوى. غالبًا ما تكون سلسلة مثل "أباتشي" أو "nginx". على الرغم من أن العنوان مسموح به ، فهو اختياري وليس ذو قيمة خاصة للمطورين أو المستخدمين النهائيين. ومع ذلك ، يعد اليوم ثالث أكثر عناوين خوادم HTTP شيوعًا على الإنترنت.
X-Powered-By
هو العنوان الأكثر شيوعًا الذي لم يتم تعريفه بواسطة أي معيار وله غرض مماثل: فهو يشير عادةً إلى النظام الأساسي للتطبيق الذي يعمل عليه الخادم. تتضمن الإجابات الأكثر شيوعًا "ASP.net" و "PHP" و "Express". مرة أخرى ، هذا لا يجلب أي فوائد ملموسة ويحدث فقط.
ربما يمكن اعتبار أكثر إثارة للجدل
Via
. يُطلب (
وفقًا لـ RFC7230 ) أن تضيف إلى
الطلب كل وكيل يمر من خلاله الطلب - لتحديد الوكيل. قد يكون هذا اسم مضيف الوكيل ، ولكن غالبًا ما يكون معرفًا عامًا مثل "vegur" أو "varnish" أو "squid". يمكن أن تؤدي إزالة (أو عدم إضافة) مثل هذا الرأس إلى
دورة إعادة توجيه الوكيل . ولكن من المثير للاهتمام أنها تمت إضافتها أيضًا استجابة لمسار العودة إلى المتصفح - وهنا تقوم ببساطة بوظيفة معلومات: لا يوجد متصفحات تفعل أي شيء معها ، لذلك فهي آمنة بما يكفي للتخلص منها إذا كنت تريد.
معايير موقوفة (P3P ، تنتهي صلاحيتها ، خيارات إطار X ، متوافقة مع X-UA)
فئة أخرى من الرؤوس هي تلك التي تسبب في الواقع تأثيرًا في المتصفح ، ولكن (بالفعل) ليست أفضل طريقة لتحقيق هذا التأثير.
P3P: cp="this is not a p3p policy"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge
P3P
هو شيء صغير ممتع. لم يكن لدي أي فكرة عما كان عليه. حتى الأكثر مرحًا ، أحد أكثر محتويات رأس P3P شيوعًا هو "هذه ليست قاعدة P3P". حسنا ، هل هذا أو لا؟
هنا ، تعود القصة إلى
محاولة توحيد قواعد الخصوصية المقروءة آليًا . كان هناك خلاف حول كيفية عرض البيانات في المتصفحات ، وقام متصفح واحد فقط بدعم هذا العنوان - Internet Explorer. ولكن حتى في ذلك ، لم يكن لـ P3P تأثير مرئي للمستخدم ؛ كان عليه فقط أن يكون حاضرا للسماح بالوصول إلى ملفات تعريف ارتباط الطرف الثالث في الإطارات. حتى أن بعض المواقع تضع قواعد عدم الامتثال P3P ، كما في المثال أعلاه ، على الرغم من أن القيام بذلك أمر
مشكوك فيه للغاية .
وغني عن القول أن قراءة ملفات تعريف الارتباط للجهات الخارجية هي فكرة سيئة عمومًا ، لذلك إذا لم تفعل ذلك ، فلن تحتاج إلى تعيين رأس
P3P
!
Expires
ببساطة بشكل لا يصدق نظرًا لأن
Cache-Control
كانت متفوقة على
Expires
لأكثر من 20 عامًا. إذا كان رأس
Cache-Control
في
Cache-Control
يحتوي على توجيه
max-age
، فسيتم تجاهل أي رأس
Expires
في الاستجابة نفسها. ولكن عددًا هائلاً من المواقع يعيّن كلا هذين الرؤوسين ،
Expires
غالبًا في تاريخ
Thu, 01 Dec 1994 16: 00: 00 GMT
، بحيث لا يتم تخزين المحتوى مؤقتًا. بالطبع ، من الأسهل نسخ التاريخ
من المواصفات .

ولكن ببساطة ليست هناك حاجة للقيام بذلك. إذا كان لديك عنوان
Expires
مع تاريخ من الماضي ، فما عليك سوى استبداله بـ:
Cache-Control: no-store, private
(
no-store
هو أمر صارم للغاية بعدم كتابة المحتوى إلى التخزين الدائم ، لذلك قد تفضل
no-cache
للحصول على أداء أفضل ، على سبيل المثال ، للتنقل إلى الخلف / الأمام أو استئناف علامات تبويب النوم في المتصفح)
تنصحك بعض أدوات التحقق من صحة الموقع بإضافة رأس
X-Frame-Options
بقيمة "SAMEORIGIN". يخبر المتصفحات أنك ترفض إرسال محتوى إلى إطار على موقع آخر: كقاعدة ، هذا دفاع جيد ضد
النقر . ولكن يمكن تحقيق نفس التأثير برأس آخر مع دعم أكثر ثباتًا وسلوكًا أكثر موثوقية:
Content-Security-Policy: frame-ancestors 'self'
هناك فائدة إضافية هنا ، لأنه لا يزال عليك إعطاء رأس CSP لأسباب أخرى (المزيد عنها لاحقًا). ربما ، في عصرنا ، يمكنك الاستغناء عن
X-Frame-Options
.
أخيرًا ، في IE9 ، قدمت Microsoft "وضع التوافق" الذي جعل الصفحة تستخدم محرك IE8 أو IE7. حتى في الوضع العادي ، اعتقد المستعرض أنه قد تكون هناك حاجة إلى إصدار أقدم من المحرك للعرض الصحيح. لم تعمل هذه الاستدلالات بشكل صحيح دائمًا ، ويمكن للمطورين تجاوزها باستخدام رأس أو علامة وصفية
X-UA-Compatible
. في الواقع ، أصبح هذا جزءًا قياسيًا من العديد من الإطارات مثل Bootstrap. الآن هذا العنوان عديم الفائدة عمليا: نسبة المتصفحات التي تفهمه صغيرة جدا. وإذا كنت تدعم الموقع بنشاط ، فمن غير المحتمل أن يستخدم تقنيات ستطلق وضع التوافق.
بيانات التصحيح (X-ASPNet-Version، X-Cache)
في بعض النواحي ، من المدهش أن بعض العناوين الأكثر شعبية لم يتم ذكرها على الإطلاق في أي معيار. وهذا يعني بشكل أساسي أن الآلاف من مواقع الويب قد وافقت بطريقة أو بأخرى بطريقة ما على استخدام عنوان معين بطريقة معينة.
X-Cache: HIT
X-Request-ID: 45a336c7-1bd5-4a06-9647-c5aab6d5facf
X-ASPNet-Version: 3.2.32
X-AMZN-RequestID: 0d6e39e2-4ecb-11e8-9c2d-fa7ae01bbebc
في الواقع ، لم يخترع المطورون هذه العناوين "غير المعروفة". عادةً ما تكون هذه عبارة عن قطع أثرية لاستخدام بعض أطر عمل الخادم أو البرامج أو الخدمات الخاصة بموردين محددين (على سبيل المثال ، الرأس الأخير نموذجي لـ AWS).
يضيف رأس
X-Cache
Fastly (وغيرها من شبكات CDN) ، جنبًا إلى جنب مع رؤوس محددة أخرى مثل
X-Cache-Hits
و
X-Served-By
. عند تمكين التصحيح ، تتم إضافة المزيد ، على سبيل المثال ،
Fastly-Debug-Path
و
Fastly-Debug-TTL
.
لم يتعرف أي متصفح على هذه الرؤوس ، ولن تؤثر إزالتها على عرض الصفحات على الإطلاق. ولكن بما أنه يمكنهم تزويدك بالمطور بمعلومات مفيدة ، يمكنك حفظها.
سوء التفاهم (براغما)
لم أكن أتوقع أنه في عام 2018 يجب أن أذكر رأس
Pragma
، ولكن وفقًا لأرشيف HTTP ، فإنه لا يزال في الأعلى (المركز الحادي عشر). لم يتم الإعلان عن أنها عفا عليها الزمن فقط في عام 1997 ، ولكن لم يتم تصورها على أنها رأس استجابة ، ولكن فقط كجزء من طلب.
Pragma: no-cache
ومع ذلك ، يتم استخدامه على نطاق واسع كرأس استجابة بحيث تتعرف عليه بعض المتصفحات في هذا السياق. لكن اليوم لا توجد فرصة تقريبًا لفهم شخص ما لـ
Pragma
في سياق الإجابة ، لكنه لا يفهم
Cache-Control
. إذا كنت ترغب في تعطيل التخزين المؤقت ، فكل ما تحتاجه هو
Cache-Control: no-store, private
.
غير المتصفحات (X-Robots-Tag)
عنوان واحد في قائمة أفضل 30 لدينا ليس عنوانًا للمتصفح.
X-Robots-Tag
لبرامج الزحف مثل Google bots أو Bing. نظرًا لأنه غير مفيد للمتصفح ، يمكنك تعيين هذه الإجابة فقط لطلبات من برامج الزحف. أو تقرر أن هذا يجعل الاختبار صعبًا أو ينتهك شروط استخدام محرك البحث.
البق
أخيرًا ، يجدر بنا أن ننتهي إلى ذكر مشرف للأخطاء البسيطة. رأس
Host
منطقي في
الطلب ، ولكن إذا ظهر في الاستجابة ، فمن المحتمل أنه لم يتم تكوين خادمك بشكل صحيح (وأود أن أعرف كيف). ومع ذلك ، فإن 68 نطاقًا في أرشيف HTTP تُرجع رأس
Host
في ردودها.
إزالة الرؤوس الموجودة على خادم CDN edge
لحسن الحظ ، إذا كان موقعك يعمل بسرعة معنا ، فإن إزالة الرؤوس بسيطة جدًا باستخدام
VCL . إذا كنت ترغب في إبقاء فريق التطوير مفيدًا حقًا لتصحيح الأخطاء ، ولكن إخفاءه عن عامة الناس ، فيمكن القيام بذلك بسهولة باستخدام ملفات تعريف الارتباط أو رأس HTTP الوارد:
unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;
if (!req.http.Cookie:debug && !req.http.Debug) {
unset resp.http.X-Amzn-RequestID;
unset resp.http.X-Cache;
}
في
المقالة التالية ، سأتحدث عن أفضل الممارسات للعناوين المطلوبة حقًا وكيفية تنشيطها على خادم CDN edge.