HTTP_HOST vs SERVER_NAME في PHP: الفرق والمخاطر

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحقيق PHP: ما الذي يختبئ وراء HTTP_HOST و SERVER_NAME؟

\n\n

إذا سبق لك أن ألقيت نظرة على المصفوفة الشاملة $_SERVER في PHP، فبالتأكيد رأيت مفتاحين متشابهين جدًا: HTTP_HOST و SERVER_NAME. للوهلة الأولى، يبدو أنهما نفس الشيء — اسم الخادم. لكن المطورين ذوي الخبرة يعرفون أن الشيطان يكمن في التفاصيل. هذا الموضوع حصد آلاف المشاهدات على Stack Overflow، وليس من دون سبب. الاختيار الخاطئ قد يؤدي إلى أخطاء في عمليات إعادة التوجيه، وأعطال في الطلبات عبر النطاقات، وحتى ثغرات أمنية.

\n

في هذه المقالة، لن نكتفي بسرد التعريفات الجافة. بل سنقوم بتحقيق حقيقي: سنشرح من أين تأتي هذه القيم، وكيف تتصرف على الخوادم المختلفة (Apache, Nginx)، والأهم من ذلك — متى نستخدم أيًا منها. استعدوا، سيكون الأمر ممتعًا.

\n\n

ما هو HTTP_HOST؟

\n

HTTP_HOST هو قيمة الترويسة Host التي يرسلها المتصفح (أو أي عميل HTTP) إلى الخادم كجزء من الطلب. هذه الترويسة إلزامية في HTTP/1.1 وتحتوي على اسم النطاق وربما رقم المنفذ.

\n

مثال على طلب من المتصفح:

\n
GET /page.php HTTP/1.1\nHost: pythonlib.com:8080\nUser-Agent: Mozilla/5.0\n...
\n

في PHP، تصل هذه القيمة إلى $_SERVER['HTTP_HOST']. لاحظ أن هذه القيمة غير موثوقة. يمكن للعميل إرسال أي نص في ترويسة Host، مثل evil-site.com أو 192.168.1.1. وهنا يكمن الخطر الرئيسي.

\n\n

ما هو SERVER_NAME؟

\n

SERVER_NAME هي القيمة التي يحددها خادم الويب نفسه بناءً على إعداداته. عادةً ما تؤخذ من التوجيه ServerName في Apache أو server_name في Nginx. هذا هو اسم المضيف الافتراضي الذي عالج الطلب.

\n

مثال على إعدادات Apache:

\n
<VirtualHost *:80>\n    ServerName pythonlib.com\n    DocumentRoot /var/www/pythonlib\n</VirtualHost>
\n

في هذه الحالة، ستكون $_SERVER['SERVER_NAME'] مساوية لـ pythonlib.com. على عكس HTTP_HOST، هذه القيمة يتحكم فيها مسؤول الخادم، وليس العميل. لكن هناك فارق بسيط: SERVER_NAME قد لا يحتوي على المنفذ (يعتمد على إعداد UseCanonicalName).

\n\n

الاختلافات الرئيسية في جدول

\n

لتوضيح الأمور، إليك جدول مقارن:

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
المعيارHTTP_HOSTSERVER_NAME
المصدرترويسة طلب HTTP من العميلإعدادات خادم الويب
التحكمالعميل (يمكن تزويره)مسؤول الخادم
المنفذيتضمن المنفذ إذا كان غير قياسي (مثل site.com:8080)عادةً بدون منفذ (يعتمد على UseCanonicalName)
الموثوقيةمنخفضة (لا تثق بها دون تحقق)عالية (ولكن ليست مطلقة)
الاستخدامإعادة التوجيه، الروابط للمستخدمالمنطق الداخلي، الأمان
\n\n

متى تستخدم كلًا منهما؟ أمثلة عملية

\n

الآن ننتقل إلى الجزء الأهم — الكود. دعنا نستعرض ثلاثة سيناريوهات نموذجية.

\n\n

1. إعادة التوجيه إلى نفس النطاق (مثل إضافة www

المدونات

توصيات الكتب