HTTP مكتوبة بواسطة بروتوكول نقل النص التشعبي. يستخدم الويب العالمي بأكمله هذا البروتوكول. يتم إرسال معظم المحتوى الذي تراه تقريبًا في متصفحك من خلال بروتوكول HTTP ، مثل هذه المقالة.
رؤوس HTTP هي طلبات HTTP والرسم المقابل ، وهي تحمل معلومات حول متصفحات العميل ، وطلب الصفحات ، والخوادم ، إلخ.
عندما تكتب عنوان URL في شريط عنوان المتصفح ، سيكون متصفحك مشابهًا لطلب HTTP التالي:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
المضيف: net.tutsplus.com
عامل المستخدم: Mozilla/5.0 (Windows ؛ U ؛ Windows NT 6.1 ؛ en-US ؛ RV: 1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
قبول: Text/HTML ، Application/XHTML+XML ، Application/XML ؛ Q = 0.9 ،*/*؛ Q = 0.8
قبول اللغة: en-us ، en ؛ q = 0.5
قبول الترميز: gzip ، انحراف
قبول-charset: ISO-8859-1 ، UTF-8 ؛ Q = 0.7 ،*؛ Q = 0.7
الحفاظ على الحافة: 300
الاتصال: الحفاظ على الحفل
ملف تعريف الارتباط: phpsessid = r2t5uvjq435r4q7ib3vtdjq120
Pragma: عدم وجود آذان
السيطرة على ذاكرة التخزين المؤقت: عدم وجود آذان
يسمى السطر الأول خط الطلب. يصف المعلومات الأساسية لهذا الطلب ، والباقي هو رؤوس HTTP.
بعد اكتمال الطلب ، قد يتلقى متصفحك استجابة HTTP التالية:
HTTP/1.x 200 OK
ترميز النقل: قطعة
التاريخ: السبت ، 28 نوفمبر 2009 04:36:25 بتوقيت جرينتش
الخادم: litespeed
الاتصال: أغلق
X-Power-By: W3 إجمالي ذاكرة التخزين المؤقت/0.8
براغما: عام
انتهاء صلاحية: السبت ، 28 نوفمبر 2009 05:36:25 بتوقيت جرينتش
ETAG: PUB1259380237 ؛ GZ
السيطرة على ذاكرة التخزين المؤقت: Max-age = 3600 ، العام
نوع المحتوى: النص/html ؛ charset = UTF-8
المعدل الأخير: السبت ، 28 نوفمبر 2009 03:50:37 بتوقيت جرينتش
x-pingback: http://net.tutsplus.com/xmlrpc.php
ترميز المحتوى: GZIP
تباين: قبول التفسير ، ملف تعريف الارتباط ، وكيل المستخدم
<!-... بقية HTML ...->
يسمى السطر الأول خط الحالة ، والذي يتبعه رؤوس HTTP. بعد الانتهاء من الخط الفارغ ، سيتم إخراج المحتوى (في هذه الحالة ، بعض إخراج HTML).
لكن لا يمكنك رؤية رؤوس HTTP عندما تنظر إلى الكود المصدري للصفحة ، على الرغم من أنها يتم إرسالها إلى المتصفح مع ما يمكنك رؤيته.
يرسل طلب HTTP أيضًا بعض الطلبات لتلقي الموارد الأخرى ، مثل الصور وملفات CSS وملفات JS ، إلخ.
لنلقي نظرة على التفاصيل أدناه.
يمكن أن تساعدك امتدادات Firefox التالية في تحليل رؤوس HTTP:
1. Firebug
2. Live HTTP رؤوس
3. في PHP:
أدناه المقالة ، سترى بعض الأمثلة على استخدام عرض PHP.
السطر الأول ، المسمى الخط الأول ، يحتوي على ثلاثة أجزاء:
الأقسام المتبقية هي كل سطر باسم: زوج القيمة. أنها تحتوي على مجموعة متنوعة من المعلومات حول الطلبات ومستعرضك. على سبيل المثال ، يشير وكيل المستخدم إلى إصدار المتصفح ونظام التشغيل الذي تستخدمه. سوف يخبر القبول الخادم أن تصفحك يمكن أن يقبل الإخراج المضغوط على غرار GZIP.
معظم هذه الرؤوس اختيارية. يمكن أن يتم تخفيض طلبات HTTP إلى هذا:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
المضيف: net.tutsplus.com
ولا يزال بإمكانك تلقي استجابة صالحة من الخادم.
أنواع الطلبات الثلاثة الأكثر شيوعًا هي: Get ، Post and Head. قد تكون على دراية بالأولين خلال عملية كتابة HTML.
يتم طلب معظم HTML ، الصور ، JS ، CSS ، ... التي تنتقل إلى المتصفح من خلال طريقة GET. إنها الطريقة الرئيسية للحصول على البيانات.
على سبيل المثال ، للحصول على مقالة Nettus+ ، عادة ما يبدو السطر الأول من طلب HTTP مثل هذا:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
بمجرد تحميل HTML ، سيرسل المتصفح طلب الحصول على الصورة ، تمامًا مثل هذا:
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
يمكن أيضًا إرسال النموذج من خلال طريقة GET. هنا مثال:
<form action=foo.php method=GET>
الاسم الأول: <input name = first_name type = text />
الاسم الأخير: <input name = last_name type = text />
<اسم الإدخال = نوع الإجراء = إرسال قيمة = إرسال />
</form>
عند تقديم هذا النموذج ، سيبدو طلب HTTP هكذا:
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...
يمكنك إرسال إدخال النموذج إلى الخادم عن طريق إلحاقه بسلسلة الاستعلام.
على الرغم من أنه يمكنك إرفاق البيانات بعنوان URL من خلال طريقة GET لتمريرها إلى الخادم ، إلا أنه من الأنسب استخدام POST لإرسال البيانات إلى الخادم في كثير من الحالات. من غير الواقعي إرسال كمية كبيرة من البيانات من خلال GET ، ولديها قيود معينة.
من الشائع استخدام طلبات البريد لإرسال بيانات النموذج. دعونا نغير المثال أعلاه لاستخدام Post:
<form action=foo.php method=POST>
الاسم الأول: <input name = first_name type = text />
الاسم الأخير: <input name = last_name type = text />
<اسم الإدخال = نوع الإجراء = إرسال قيمة = إرسال />
</form>
سيؤدي إرسال هذا النموذج إلى إنشاء طلب HTTP على النحو التالي:
POST /foo.php HTTP/1.1
المضيف: LocalHost
عامل المستخدم: Mozilla/5.0 (Windows ؛ U ؛ Windows NT 6.1 ؛ en-US ؛ RV: 1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
قبول: Text/HTML ، Application/XHTML+XML ، Application/XML ؛ Q = 0.9 ،*/*؛ Q = 0.8
قبول اللغة: en-us ، en ؛ q = 0.5
قبول الترميز: gzip ، انحراف
قبول-charset: ISO-8859-1 ، UTF-8 ؛ Q = 0.7 ،*؛ Q = 0.7
الحفاظ على الحافة: 300
الاتصال: الحفاظ على الحفل
المرجع: http: //localhost/test.php
نوع المحتوى: التطبيق/x-www-form-urlencoded
طول المحتوى: 43
first_name = John & last_name = doe & action = submit
فيما يلي ثلاثة أشياء يجب ملاحظة:
يمكن أيضًا استخدام طلبات طريقة النشر على Ajax ، التطبيقات ، حليقة ... ويحتاج جميع نماذج تحميل الملفات لاستخدام Post.
الرأس والحصول متشابهان للغاية ، باستثناء أن الرأس لا يقبل جزء المحتوى من استجابة HTTP. عندما ترسل طلب رأس ، فهذا يعني أنك مهتم فقط برأس HTTP ، وليس المستند نفسه.
تتيح هذه الطريقة للمتصفح تحديد ما إذا كانت الصفحة قد تم تعديلها وبالتالي تتحكم في ذاكرة التخزين المؤقت. يمكن أيضًا تحديد ما إذا كانت الوثيقة المطلوبة موجودة.
على سبيل المثال ، إذا كان لديك العديد من الروابط على موقع الويب الخاص بك ، فيمكنك ببساطة إرسال طلبات الرأس لهم بشكل منفصل لتحديد ما إذا كانت هناك روابط ميتة ، وهي أسرع بكثير من استخدام GET.
عندما يرسل المتصفح طلب HTTP ، سيستجيب الخادم للطلب من خلال استجابة HTTP. إذا كنت لا تهتم بالمحتوى ، فسيبدو الطلب هكذا:
المعلومات القيمة الأولى هي الاتفاقية. حاليًا ، سيستخدم الخادم HTTP/1.x أو HTTP/1.1.
بعد ذلك ، تمثل رسالة موجزة الحالة. الرمز 200 يعني أنه تم إرسال طلبنا بنجاح ، وسيقوم الخادم بإرجاع المستند المطلوب بعد معلومات الرأس.
لقد رأينا جميعًا الصفحة 404. عندما أطلب مسارًا غير موجود من الخادم ، يستجيب الخادم لنا بـ 404 بدلاً من 200.
يشبه بقية الاستجابة طلب HTTP. هذه تدور حول برامج الخادم ، عندما يتم تعديل الصفحات/الملفات ، ونوع MIME ، إلخ ...
وبالمثل ، فإن معلومات الرأس هذه اختيارية.
كما ذكر أعلاه ، يتم استخدام 200 للإشارة إلى أن الطلب ناجح.
206 محتوى جزئيإذا طلب التطبيق الملفات فقط ضمن نطاق معين ، فسيتم إرجاع 206.
عادة ما يستخدم هذا لتنزيلات التنزيل أو استمرار نقطة الإيقاف أو تنزيلات قطع الملفات.
404 لم يتم العثور عليهامن السهل الفهم
401 غير مصرح بهستعود الصفحات المحمية بكلمة المرور إلى هذه الحالة. إذا لم تقم بإدخال كلمة المرور الصحيحة ، فسترى المعلومات التالية في متصفحك:
لاحظ أن هذه مجرد صفحة محمية بكلمة مرور. يبدو أن المربع المنبثق الذي يطلب إدخال كلمة مرور مثل هذا:
403 ممنوعإذا لم يكن لديك إذن للوصول إلى صفحة ، فسيعود إلى حالة 403. يحدث هذا عادة عندما تحاول فتح مجلد بدون صفحة فهرس. إذا كانت إعدادات الخادم لا تسمح بمشاهدة محتويات الدليل ، فسترى خطأ 403.
تقوم الطرق الأخرى أيضًا بإرسال قيود على الإذن ، مثل يمكنك حظرها من خلال عنوان IP الخاص بك ، مما يتطلب بعض المساعدة HTACCESS.
order allow,deny
رفض من 192.168.44.201
منكر من 224.39.163.12
منكر من 172.16.7.92
السماح من الجميع
302 (أو 307) انتقل مؤقتًا و 301 تحرك بشكل دائمستظهر هاتان الدولتان عندما يعيد المستعرض توجيهًا. على سبيل المثال ، يمكنك استخدام خدمة تقصير عنوان URL مثل bit.ly. هذه هي أيضًا كيف يعرفون من الذي نقر على رابطهم.
يتشابه 302 و 301 إلى حد كبير مع المتصفحات ، ولكن هناك بعض الاختلافات في زحف محرك البحث. على سبيل المثال ، إذا تم الحفاظ على موقع الويب الخاص بك ، فسوف تقوم بإعادة توجيه متصفح العميل إلى عنوان آخر مع 302. سوف يقوم زحف محرك البحث بتوديس صفحتك في المستقبل. ولكن إذا كنت تستخدم إعادة توجيه 301 ، فهذا يعني أنك تخبر زاحف محرك البحث: لقد تم نقل موقع الويب الخاص بك بشكل دائم إلى العنوان الجديد.
خطأ 500 خادم (خطأ خادم داخلي)عادةً ما يظهر هذا الرمز عند تعطل البرنامج النصي للصفحة. معظم البرامج النصية CGI لا تخرج رسائل الخطأ إلى المتصفح مثل PHP. في حالة حدوث خطأ فادح ، فسيقومون فقط بإرسال رمز الحالة 500. في هذا الوقت ، تحتاج إلى التحقق من سجل خطأ الخادم لاستكشاف الأخطاء وإصلاحها.
قائمة كاملةيمكنك العثور على وصف رمز حالة HTTP الكامل هنا. أو تحقق من ذلك هنا (http://tools.vevb.com/table/http_status_code).
الآن دعونا نلقي نظرة على بعض معلومات طلب HTTP الشائعة في رؤوس HTTP.
يمكن العثور على كل معلومات الرأس هذه في صفيف $ _Server من PHP. يمكنك أيضًا استخدام وظيفة getAllheaders () للحصول على جميع معلومات الرأس مرة واحدة.
سيتم إرسال طلب HTTP إلى عنوان IP محدد ، ولكن لدى معظم الخوادم القدرة على استضافة مواقع ويب متعددة ضمن نفس عنوان IP ، لذلك يجب على الخادم معرفة اسم المجال الذي يطلبه المتصفح.
Host: rlog.cn
هذا مجرد اسم مضيف أساسي ، بما في ذلك أسماء المجال وأسماء مجال الطفل.
في PHP ، يمكنك عرضه عبر $ _server ['http_host'] أو $ _server ['server_name'].
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
يمكن لهذا الرأس أن يحمل المعلومات التالية:
هذه هي الطريقة العامة التي تستخدمها بعض مواقع الويب لجمع معلومات الزوار. على سبيل المثال ، يمكنك معرفة ما إذا كان الزائر يستخدم هاتفك لزيارة موقع الويب الخاص بك ثم تحديد ما إذا كان سيتم توجيهه إلى موقع ويب للهاتف المحمول الذي يعمل بشكل جيد بدقة منخفضة.
في PHP ، يمكن الحصول على وكيل المستخدم من خلال $ _server ['http_user_agent']
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
صدى من فضلك توقف عن استخدام IE6! ؛
}
Accept-Language: en-us,en;q=0.5
يمكن أن تشير هذه المعلومات إلى إعدادات اللغة الافتراضية للمستخدم. إذا كان موقع الويب يحتوي على إصدار لغة مختلف ، فيمكنك استخدام هذه المعلومات لإعادة توجيه متصفح المستخدم.
يمكن حملها بلغات متعددة عن طريق تجزئة الفاصلة. أول واحد سيكون اللغة المفضلة ، وستحمل اللغات الأخرى قيمة Q للإشارة إلى تفضيل المستخدم للغة (0 ~ 1).
استخدم $ _server [http_accept_language] في PHP للحصول على هذه المعلومات.
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
header ('الموقع: http://french.mydomain.com') ؛
}
Accept-Encoding: gzip,deflate
تدعم معظم المتصفحات الحديثة ضغط GZIP وستقوم بالإبلاغ عن هذه المعلومات إلى الخادم. في هذا الوقت ، سيتم إرسال HTML المضغوط إلى المتصفح. هذا يمكن أن يقلل من حجم الملف بنسبة حوالي 80 ٪ لتوفير وقت التنزيل وعرض النطاق الترددي.
يمكن الحصول على هذه المعلومات باستخدام $ _server [http_accept_encoding] في PHP. ثم سيتم اكتشاف القيمة تلقائيًا عند استدعاء طريقة OB_GZHandler () ، لذلك لا تحتاج إلى اكتشافها يدويًا.
// enables output buffering
// وجميع الإخراج مضغوط إذا كان المتصفح يدعمه
OB_START ('OB_GZHandler') ؛
إذا تم تخزين صفحة مخبأة في متصفحك ، في المرة القادمة التي تصفح فيها المتصفح ، فسوف تحقق المتصفح ما إذا كان قد تم تعديل المستند ، وسوف يرسل رأسًا مثل هذا:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
إذا لم يتم تعديله منذ هذا الوقت ، فسيقوم الخادم بإرجاع 304 ولم يتم تعديله ولن يعيد المحتوى. سيقوم المتصفح بقراءة المحتوى تلقائيًا في ذاكرة التخزين المؤقت
في PHP ، يمكنك استخدام $ _server ['http_if_modified_since'] للكشف.
// assume $last_modify_time was the last the output was updated
// هل أرسل المتصفح رأسًا معدلًا؟
if (isset ($ _ server ['http_if_modified_since'])) {
// إذا كان ذاكرة التخزين المؤقت للمتصفح تتطابق مع الوقت المعدل
if ($ last_modify_time == strtotime ($ _ server ['http_if_modified_since'])) {
// إرسال رأس 304 ، ولا محتوى
رأس (HTTP/1.1 304 غير معدّل) ؛
مخرج؛
}
}
يوجد أيضًا رأس HTTP يسمى ETAG ، والذي يتم استخدامه لتحديد ما إذا كانت المعلومات المخزنة صحيحة ، وسنشرحها لاحقًا.
كما يوحي الاسم ، سوف يرسل معلومات ملفات تعريف الارتباط المخزنة في متصفحك إلى الخادم.
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
إنها مجموعة من أزواج القيمة التي يقسمها فاصلة فاصلة. يمكن أن تشمل ملفات تعريف الارتباط أيضًا معرف الجلسة.
في PHP ، يمكن الحصول على ملف تعريف ارتباط واحد عن طريق الوصول إلى مجموعة $ _cookie. يمكنك استخدام صفيف $ _session مباشرة للحصول على متغير الجلسة. إذا كنت بحاجة إلى معرف الجلسة ، فيمكنك استخدام وظيفة SESSING_ID () بدلاً من ملف تعريف الارتباط.
echo $_COOKIE['foo'];
// الإخراج: شريط
echo $ _cookie ['phpsessid'] ؛
// الإخراج: R2T5UVJQ435R4Q7IB3VTDJQ120
session_start () ؛
echo session_id () ؛
// الإخراج: R2T5UVJQ435R4Q7IB3VTDJQ120
كما يوحي الاسم ، سيحتوي الرأس على معلومات URL المرجعية.
على سبيل المثال ، قمت بزيارة الصفحة الرئيسية لـ Nettus+ ونقرت على رابط ، وسيتم إرسال هذا الرأس إلى المتصفح:
Referer: http://net.tutsplus.com/
في PHP ، يمكن الحصول على القيمة بواسطة $ _server ['http_referer'].
if (isset($_SERVER['HTTP_REFERER'])) {
$ url_info = parse_url ($ _ server ['http_referer']) ؛
// هل الأمواج يأتي من Google؟
if ($ url_info ['host'] == 'www.google.com') {
parse_str ($ url_info ['query'] ، $ vars) ؛
صدى لقد بحثت على Google عن هذه الكلمة الرئيسية :. $ vars ['q'] ؛
}
}
// إذا كان عنوان URL الإحالة:
// http://www.google.com/search؟source=ig&hl=en&rlz=&q &q=http+ Heads&AQ=F&OQ=&AQI=G-P1G9
// سيكون الإخراج:
// لقد بحثت على Google عن هذه الكلمة الرئيسية: HTTP Headers
ربما لاحظت أن كلمة "إحالة" تم إملائها كمرجع. لسوء الحظ ، تم تحويله إلى مواصفات HTTP الرسمية من هذا القبيل وعلق.
عندما تتطلب الصفحة إذنًا ، سيظهر المتصفح نافذة تسجيل الدخول. بعد إدخال الحساب الصحيح ، سيرسل المتصفح طلب HTTP ، لكنه سيحتوي على رأس:
Authorization: Basic bXl1c2VyOm15cGFzcw==
هذا الجزء من المعلومات الواردة في الرأس هو BASE64 مشفرة. على سبيل المثال ، سيتم تحويل BASE64_DECODE ('BXL1C2VYOM15CGFZCW ==') إلى "myuser: mypass".
في PHP ، يمكن الحصول على هذه القيمة باستخدام $ _server ['php_auth_user'] و $ _server ['php_auth_pw'].
سنشرح المزيد من التفاصيل في قسم مصادقة www.
الآن اسمحوا لي أن أفهم بعض معلومات استجابة HTTP في رؤوس HTTP المشتركة.
في PHP ، يمكنك تعيين معلومات استجابة الرأس من خلال Header (). أرسلت PHP تلقائيًا بعض معلومات الرأس اللازمة ، مثل المحتوى المحمّل ، وإعداد ملفات تعريف الارتباط ، وما إلى ذلك ... يمكنك رؤية المرسلة وإرسالها من خلال وظيفة Headers_List (). يمكنك أيضًا استخدام وظيفة Headers_Sent () للتحقق مما إذا كان قد تم إرسال معلومات الرأس.
يتم تعريف W3.org على النحو التالي: يتم استخدام حقل Header للسيطرة على ذاكرة التخزين المؤقت لتحديد التوجيهات التي يجب أن تطيعها جميع آليات التخزين المؤقت على طول سلسلة الطلب/الاستجابة. حيث تحتوي آليات التخزين المؤقت على بعض معلومات البوابة والوكالة التي قد يستخدمها ISP الخاص بك.
على سبيل المثال:
Cache-Control: max-age=3600, public
الجمهور يعني أن الاستجابة يمكن أن يتم تخزينها مؤقتًا من قبل أي شخص ، ويشير الحد الأقصى إلى عدد الثواني التي يكون ذاكرة التخزين المؤقت صالحة. يسمح موقع الويب الخاص بك بالتخطيط للتنفيذ لتقليل وقت التنزيل وعرض النطاق الترددي بشكل كبير ، مع تحسين سرعة تحميل المتصفح.
يمكنك أيضًا تعطيل ذاكرة التخزين المؤقت عن طريق إعداد أمر عدم التخزين المؤقت:
Cache-Control: no-cache
لمزيد من التفاصيل ، يرجى الاطلاع على W3.org.
يحتوي هذا الرأس على نوع MIME من المستند. سيقرر المستعرض كيفية تحليل المستند بناءً على هذه المعلمة. على سبيل المثال ، ستعيد صفحة HTML (أو صفحة PHP مع إخراج HTML) شيئًا كهذا:
Content-Type: text/html; charset=UTF-8
"النص" هو نوع المستند ، و "HTML" هو النوع الفرعي المستند. يتضمن هذا الرأس أيضًا المزيد من المعلومات ، مثل Charset.
إذا كانت صورة ، فسيتم إرسال رد مثل هذا:
Content-Type: image/gif
يمكن للمتصفح استخدام نوع MIME لتحديد ما إذا كان سيتم استخدام البرامج الخارجية أو لتوسيع المستند نفسه. المثال التالي يقلل من مكالمة قارئ Adobe:
Content-Type: application/pdf
التحميل مباشرة ، ستحكم Apache عادةً على نوع MIME من المستند وإضافة المعلومات المناسبة إلى الرأس. علاوة على ذلك ، فإن معظم المتصفحات لديها درجة معينة من التسامح مع الأخطاء. إذا لم يوفر الرأس أو يقدم المعلومات بشكل غير صحيح ، فسيقوم تلقائيًا باكتشاف نوع MIME.
يمكنك العثور على قائمة من أنواع MIME شائعة الاستخدام هنا.
في PHP ، يمكنك استخدام finfo_file () للكشف عن نوع IME للملف.
سيخبر هذا الرأس المتصفح بفتح نافذة تنزيل ملف بدلاً من محاولة تحليل محتويات الاستجابة. على سبيل المثال:
Content-Disposition: attachment; filename=download.zip
يتسبب في أن يكون للمتصفح مربع حوار مثل هذا:
لاحظ أن معلومات رأس المحتوى التي تناسبها سيتم إرسالها أيضًا.
Content-Type: application/zip
تحديد المحتوى: المرفق. اسم الملف = تنزيل
عندما يتم نقل المحتوى إلى المتصفح ، يمكن للخادم استخدام هذا الرأس لإبلاغ المتصفح بحجم (بايت) للملف المراد نقله.
Content-Length: 89123
هذه المعلومات مفيدة للغاية لتنزيلات الملفات. هذا هو السبب في أن المتصفح يعرف تقدم التنزيل.
على سبيل المثال ، كتبت هنا نصًا افتراضيًا لمحاكاة تنزيل بطيء.
// it's a zip file
رأس ('نوع المحتوى: التطبيق/zip') ؛
// 1 مليون بايت (حوالي 1 megabyte)
رأس ("طول المحتوى: 1000000") ؛
// قم بتحميل مربع حوار تنزيل ، وحفظه كـ download.zip
header ('disposition content: filename = download.zip') ؛
// 1000 مرة 1000 بايت من البيانات
لـ ($ i = 0 ؛ $ i <1000 ؛ $ i ++) {
Echo str_repeat (. ، 1000) ؛
// النوم لإبطاء التنزيل
Usleep (50000) ؛
}
ستكون النتيجة هكذا:
الآن ، أعلق رأس طول المحتوى:
// it's a zip file
رأس ('نوع المحتوى: التطبيق/zip') ؛
// لن يعرف المتصفح الحجم
// header ("طول المحتوى: 1000000") ؛
// قم بتحميل مربع حوار تنزيل ، وحفظه كـ download.zip
header ('disposition content: filename = download.zip') ؛
// 1000 مرة 1000 بايت من البيانات
لـ ($ i = 0 ؛ $ i <1000 ؛ $ i ++) {
Echo str_repeat (. ، 1000) ؛
// النوم لإبطاء التنزيل
Usleep (50000) ؛
}
أصبحت النتيجة هذا:
لن يخبرك هذا المتصفح فقط بالمبلغ الذي قمت بتنزيله ، لكن لن يخبرك بالمبلغ الذي تحتاجه للتنزيل في المجموع. ولن يظهر شريط التقدم تقدمًا.
هذه معلومات رأس أخرى تم إنشاؤها لذاكرة التخزين المؤقت. سيبدو هكذا:
Etag: pub1259380237;gz
يجوز للخادم الرد على هذه المعلومات مع كل ملف إرسال إلى المتصفح. يمكن أن تحتوي هذه القيمة على آخر تاريخ تم تعديله أو حجم الملف أو فحص الملفات من المستند. سوف التصفح تخزينها مع المستند المستلم. في المرة التالية التي يطلب فيها المتصفح نفس الملف مرة أخرى ، سيتم إرسال طلب HTTP التالي:
If-None-Match: pub1259380237;gz
إذا كانت قيمة ETAG المستند المطلوبة متسقة معها ، فسيقوم الخادم بإرسال رمز الحالة 304 بدلاً من 2OO. ولا يتم إرجاع أي محتوى. سيقوم المتصفح بتحميل الملف من ذاكرة التخزين المؤقت في هذا الوقت.
كما يوحي الاسم ، تستخدم معلومات الرأس هذه تنسيق GMT للإشارة إلى آخر وقت تعديل للوثيقة:
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
$modify_time = filemtime($file);
الرأس (المعدل الأخير :. gmdate (d ، d myh: i: s ، $ modify_time). gmt) ؛
يوفر آلية تخزين مؤقت أخرى. قد يرسل المتصفح طلبًا كهذا:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
لقد ناقشنا ذلك بالفعل في القسم المعدّي.
يستخدم هذا الرأس لإعادة التوجيه. إذا كان رمز الاستجابة هو 301 أو 302 ، فيجب على الخادم إرسال الرأس. على سبيل المثال ، عند زيارة http://www.nettus.com ، سيتلقى المتصفح الرد التالي:
HTTP/1.x 301 Moved Permanently
...
الموقع: http://net.tutsplus.com/
...
في PHP ، يمكنك إعادة توجيه الزوار بهذه الطريقة:
header('Location: http://net.tutsplus.com/');
بشكل افتراضي ، سيتم إرسال رمز الحالة 302. إذا كنت ترغب في إرسال 301 ، فما عليك سوى اكتبها مثل هذا:
header('Location: http://net.tutsplus.com/', true, 301);
عندما يحتاج موقع الويب إلى تعيين أو تحديث معلومات ملفات تعريف الارتباط التي تتصفحها ، فسيستخدم مثل هذا الرأس:
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-cookie: معرف الجلسة = 120-7333518-8165026 ؛ المسار =/؛ المجال = .amazon.com ؛ تنتهي = السبت 27 فبراير 08:00:00 2010 GMT
سيتم استخدام كل ملف تعريف ارتباط كرأس منفصل. لاحظ أن إعداد ملفات تعريف الارتباط من خلال JS لن ينعكس في رأس HTTP.
في PHP ، يمكنك تعيين ملفات تعريف الارتباط من خلال وظيفة setCookie () ، وسوف ترسل PHP رؤوس HTTP المناسبة.
setcookie(TestCookie, foobar);
سوف يرسل رأسًا مثل هذا:
Set-Cookie: TestCookie=foobar
إذا لم يتم تحديد وقت انتهاء الصلاحية ، فسيتم حذف ملف تعريف الارتباط بعد إغلاق المتصفح.
قد يرسل موقع الويب معلومات الرأس هذه عبر HTTP للتحقق من المستخدمين. سيتم فتح نافذة منبثقة عندما يرى المتصفح هذا الرد في الرأس.
WWW-Authenticate: Basic realm=Restricted Area
سيبدو هكذا:
في فصل من دليل PHP ، هناك رمز بسيط يوضح كيفية القيام بشيء مثل هذا مع PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
رأس ('www-authenticate: عالم أساسي = عالم بلدي') ؛
رأس ('http/1.0 401 غير مصرح به') ؛
صدى "نص لإرساله إذا ضرب المستخدم CANCELENT" ؛
مخرج؛
} آخر {
Echo <p> Hello {$ _server ['php_auth_user']}. </p> ؛
echo <p> لقد أدخلت {$ _server ['php_auth_pw']} ككلمتك. </p> ؛
}
عادة ما يتم ضبط هذا الرأس عند ضغط محتوى الإرجاع.
Content-Encoding: gzip
في PHP ، إذا اتصلت بوظيفة OB_GZHandler () ، فسيتم تعيين هذا الرأس تلقائيًا.
العنوان الأصلي: http://css9.net/all-about-http-headers/