لابد أنك تعرف أن فكرة عمل الموقع الإلكتروني ( Website ) هي عبارة عن معلومات يتم تبادلها بين المتصفح والخادم ( Web Server ) عن طريق بروتوكول نقل المعلومات ( HTTP ) وتختلف أنواع هذه المعلومات ( نصوص – صور – ملفات ). وقد يبدو لك أن هذه المعلومات هي فقط التي يتم تبادلها بين المتصفح والخادم ذهاباً وإياباً فأنت لا ترى غيرها عند تصفح موقع إلكتروني ما.
لكن هذا غير صحيح، فهناك بعض المعلومات التي لا تظهر للشخص فهي معلومات تهم كلاً من المتصفح والخادم لكن ليس لها أهمية لمن يتصفح الموقع ويتم إضافة هذه المعلومات فيما يسمى بالـ header. لكن بالطبع لها أهمية لمالك الموقع لأنه يحتاج دائماً لإدارة هذه المعلومات . لكن قبل أن نبدأ في التحدث عن الـ header أريد منك أن تتذكر هذا المثال :
في بيوتنا غالباً عندما يريد الإبن شيئاً يطلبه من والدته، ثم تذهب الأم إلى الأب لمناقشة الأمر داخل غرفة ما، ثم تأتي الأم لإبن بالنتيجة. فالابن تصله النتيجة فقط دون معرفة تفاصيل الحوار وهذا ما يهمه فقط.
قياساً على ذلك يمكننا تشبيه العلاقة بين العميل والمتصفح والخادم :
الابن هو العميل الذي يطلب عرض محتوى موقع ما الأم هي المتصفح المسؤل عن عرض الطلبات على الخادم وجلب النتائج للعميل الأب هو الخادم الذي يفحص الطلبات وإمكانية تنفيذها ثم الرد على الأم الغرفة هي الـ header الذي يتم فيه تبادل المعلومات بين المتصفح والخادمبالتالي يمكننا تقسيم هذه المعلومات إلى نوعان :
طلبات ( Header Requests ) : هي المعلومات التي يتم إرسالها من المتصفح إلى الخادم
ردود ( Header Responses ) : هي المعلومات التي يتم إرسالها من الخادم إلى المتصفح
بالتالي تتلخص العملية في أن العميل يكتب عنوان صفحة ويب في المتصفح فيقوم المتصفح بإرسال الطلبات ( Header Requests ) إلى الخادم فيقوم بمعالجة هذه المعلومات ثم يقوم بالرد ( Header Responses ) على المتصفح ثم يقوم المتصفح بعرض ما يفترض عرضه للعميل.
الآن لكي تكون الأمور أكثر وضوحاً سنقوم بالوصول لمعلومات الـ header لأي صفحة ويب ولتكن الصفحة إرسال القيم باستخدام GET و POST. لكن عليك تنصيب هذه الإضافة الرائعة Live HTTP Headers الخاصة بالمتصفح Firefox .
بعد تنصيب الإضافة يمكن أن تحتاج لإعادة تشغيل المتصفح مرة أخري لكي تظهر أيقونة الإضافة في شريط الأدوات

قم بالنقر على هذه الأيقونة لتفتح لك صفحة headers خالية ثم قم بفتح الصفحة المذكورة، ستلاحظ أنه تم عرض جميع الطلبات والردود لجميع الروابط التي قامت الصفحة بطلبها من الخادم ، وتظهر نتاائج الـ Header كما يلي

ستجد عند عرض الـ Headers الخاصة بالصفحة المذكورة أنه تنقسم الـ Headers إلى قسمين ( الردود -الطلبات )، وكما ترى فهناك مجموعة من الأسطر والتي سنقوم بشرحها الآن . مع العلم أن هذه الأسطر ليست افتراضية فهي تتغير حسب كل موقع وربما تنقص أو تزيد.
كما يظهر في الصورة السابقة أن الـ Headers عبارة عن مجموعة من الأسطر على شكل اسم : قيمة ( Name : Value )
الطلبات ( Header Requests ) :
1 – السطر الأول هو سطر الطلب ويتكون من ثلاثة أقسام :
القسم الأول وهو طريقة ( Method ) ارسال البيانات ( GET ) وهناك طرق شائعة لإرسال البيانات أخرى مثل ( POST – HEAD ) ولمعرفة المزيد يمكنك قراءة إرسال القيم باستخدام GET و POST. القسم الثاني هو المسار ( Path ) الخاص بالرابط المطلوب وهو الجزء الذي يأتي بعد اسم الدومين ( Domain Name ). فإذا كان الرابط المطلوب هو ” https://makiomar.com/php-sending-values-by-get-and-post/ ” يكون المسار هو ” /php-sending-values-by-get-and-post/ “. القسم الثالث هو بروتوكول النقل ويحتوي على HTTP يليها رقم الإصدار وعادة يكون 1.1 في المتصفحات الحديثة.2 – يليها مجموعة الـ Headers Responses على شكل اسم : قيمة ( Name : Value )، وتحتوي على المعلومات التي يرسلها المتصفح إلى الخادم مثل User-Agent التي تقوم بإرسال معلومات عن التصفح المستخدم ونظام التشغيل.
الردود ( Header responses ) :
1 – ينقسم السطر الأول إلى قسمين :
مرة أخرى بروتوكول النقل متبوعاً برقم الإصدار ثم كود حالة الوصول ( Status Code ) وهو يعبر عن حالة الوصول للمعلومات . والكود 200 يعني أنه تم جلب المعلومات بنجاح ، و بالتأكيد انك رأيت الكود 404 والذي يظهر في حالة عدم الوصول للمعلومات ( الرابط غير موجود )2 – ثم يظهر بعد ذلك الأسطر الخاصة بالردود أيضاً على شكل اسم : قيمة مثل نوع السيرفر Server:nginx/1.10.2 ، أو نوع المعلومات المرسلة Content-Type : text/html وهكذا.
وبعد أن تعرفت على الفكرة العامة للـ Headers وكيف يتم تبادل المعلومات بين المتصفح والخادم يجب عليك أن تقرأ أكثر عن أنواع الطلبات ( PHP Header Requests ) وأنواع الردود( PHP Header Responses ).
هل لاحظت أن الـ HTTP Headers عبارة عن مصفوفة ترابطية متعددة الأبعاد ( Multi-Dimensional Associative Array ) ؟
إذا لاحظت ذلك ! فهل تتذكر أن جملة ( PHP Foreach ) تقوم بعمل التكرار الحلقي داخل المصفوفات ( PHP Arrays ) ؟
الآن يمكننا التأكد من أنه يتم تخزين الـ HTTP Headers داخل دالة ترابطية عن طريق عرض هذه الـ headers باستخدام الدالة ()getallheaders.
قم بتشغيل الخادم المحلي Local Server. قم بإضافة ملف test.php داخل جذر الموقع . ( htdocs إذا كنت تستخدم Xampp ). قم بإضافة الكود التالي ثم فتح الملف في المتصفح <?php foreach (getallheaders() as $name => $value) { echo '<pre>'; echo "$name: $value <br>"; echo '</pre>'; } ?>إذا كنت قد قمت بالخطوات صحيحة سوف ترى جميع الـ headers على شكل اسم : قيمه
Host: localhost User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 كيف يتم التعديل على الـ Headerيتم التعديل أو اضافة المعلومات للـ Header عن طريق الدالة ()header.
مثلاً: من الـ headers المعروفة الـ ( PHP Location Header ) والذي يستخدم لإعادة توجيه الصفحة. لذلك إذا أردنا استخدام هذا الـ header يمكننا كتابته كالآتي
<?php header(location : 'www.eaxmple.com/login')?>
باالتالي سيتم توجيه المستخدم من الصفحة الحالية إلى صفحة تسجيل الدخول.
[highlight background=”” color=””]يجب كتابة الـ Header قبل أي شيئ في الصفحة[/highlight]
ما لا يجب أن تنسى نهائياً عن الـ Headersمن منا لم يظهر له هذا التحذير
Warning: Cannot modify header information – headers already sent by…..
وهذا معناه أنه لا يمكن التعديل على الـ headers لأنه قد تم إرسالها بالفعل. ولكن كيف؟
قلنا أن الـ Header يجب كتابته قبل أي شيئ لأن php ستقوم بإرساله أولاً ثم عرض محتوى الصفحة، أي إذا قمت بفتح ملف php به بعض الأسطر أو حتى خالي فإنه يتم إرسال معلومات الـ header مباشرة. لذلك إذا حاولت التعديل على الـ header في نفس الوقت الذي يوجد به سطر قبل بادئة الملف php?> فلن يتم عمل التعديلات ويظهر هذا التحذير. لان في هذه الحالة تعتبر الصفحة بها محتوى يجيب معالجته من قبل الخادم وبالتالي يقوم php بعمل الـ Header الافتراضي ثم يعرض المحتوي لكن لن ينظر لأي تعديل على الـ Header أو حتى محاولة تعريف أي قيمة داخل الـ header ( مثل عند اعداد الكعكات ). لذلك هذا الكود الذي يحاول اعداد كعكة ( PHP Cookies ) لن يأتي بالنتيجة المطلوبة بسبب وجود السطر الذي بادئة الملف
Welcome <?php $test = 'لا يوجد قيمة'; if (isset($_COOKIE['test'])) $test = $_COOKIE['test']; setcookie('test', 'الكعكة الآن لها قيمة'); echo "<p><b>قيمة الكعكة هي: $test</b></p>".'<br>'; ?>