ویژگی تصویر

تابع headers_list() در PHP

  /  PHP   /  تابع headers_list() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع headers_list() در PHP ابزاری ساده اما کاربردی برای مشاهده هدرهایی است که از طرف اسکریپت PHP آمادهٔ ارسال شده‌اند. این تابع مخصوصاً برای دیباگینگ، بررسی تداخل هدرها، و مدیریت هوشمند هدرها در برنامه‌های وب بسیار مفید است.

چرا headers_list() مهم است؟

  • به برنامه‌نویس اجازه می‌دهد قبل از ارسال واقعی پاسخ HTTP، فهرست هدرهای فعلی را ببیند.
  • کمک می‌کند تا از ارسال هدرهای تکراری یا ناسازگار جلوگیری شود.
  • قابل استفاده در middleware و فیلترهای خروجی برای اصلاح یا لاگ‌برداری هدرها.

خلاصهٔ عملکرد

نام تابعخروجیتوضیح
headers_list()arrayآرایه‌ای از رشته‌های هدر (مانند “Content-Type: text/html”) که آماده ارسال یا قبلاً ارسال شده‌اند.

نحو استفاده و مثال ساده

// مثال ساده: اضافه کردن هدر و نمایش لیست هدرها
header('X-Demo: hello-world');
header('Cache-Control: no-cache');
setcookie('user', 'alice', time()+3600);

var_dump(headers_list());

در این مثال، ابتدا دو هدر با استفاده از تابع header() و یک کوکی با setcookie() اضافه می‌کنیم. سپس با headers_list() همهٔ هدرهایی که PHP قرار است ارسال کند (از جمله Set-Cookie) را در قالب آرایه نمایش می‌دهیم. خروجی var_dump ممکن است چیزی شبیه به این باشد:

array(3) {
  [0]=>
  string(13) "X-Demo: hello-world"
  [1]=>
  string(18) "Cache-Control: no-cache"
  [2]=>
  string(31) "Set-Cookie: user=alice; expires=...; path=/"
}

توضیح: خروجی بالا نمونه‌ای از آن چیزی است که PHP برای ارسال آماده کرده است. اگر هدرها قبلاً ارسال شده باشند، بسته به SAPI ممکن است این تابع همچنان همان آرایه را بازگرداند یا فقط هدرهای ثبت‌شده در PHP را نشان دهد.

حذف یا جایگزینی هدرها

یکی از موارد کاربردی headers_list()، بررسی تأثیر header_remove() یا پارامتر replace تابع header() است. توجه داشته باشید که اگر برای header() پارامتر replace را false قرار دهید، می‌توانید هدرهای تکراری داشته باشید و headers_list() تمامی آنها را نمایش می‌دهد.

// حذف هدر نمونه و بررسی لیست
header('X-Temp: value1');
header('X-Temp: value2', false); // اضافه کردن هدر تکراری
header_remove('X-Temp');

var_dump(headers_list());

توضیح: در این کد ابتدا دو هدر X-Temp اضافه شده که یکی با replace=false هدر دوم را به صورت تکراری می‌افزاید. سپس با header_remove(‘X-Temp’) همهٔ هدرهای با نام X-Temp حذف می‌شوند و headers_list() نشان می‌دهد که دیگر آن هدرها وجود ندارند.

ارتباط با headers_sent() و بافر خروجی

  • قبل از فراخوانی header() یا setcookie() بهتر است بررسی کنید که هدرها هنوز ارسال نشده باشند: headers_sent() برای این کار مفید است.
  • استفاده از بافر خروجی (ob_start()) به شما اجازه می‌دهد حتی پس از تولید محتوای HTML هم هدرها را تغییر دهید یا بررسی کنید.
// نمونهٔ کاربردی: چک کردن headers_sent قبل از ارسال
if (!headers_sent()) {
    header('Content-Type: application/json; charset=utf-8');
} else {
    error_log('Cannot send header: headers already sent');
}

توضیح: اگر خروجی قبلاً شروع شده باشد، ارسال هدر جدید باعث خطا یا رفتار نامطلوب می‌شود؛ لذا ابتدا با headers_sent() بررسی می‌کنیم. استفاده از بافر خروجی می‌تواند از این مشکل جلوگیری کند.

موارد و نکات مهم و حرفه‌ای

  • headers_list() هدرهایی که وب‌سرور (مانند Apache یا nginx) بعد از PHP اضافه می‌کند را نشان نمی‌دهد؛ تنها هدرهایی که توسط PHP ایجاد یا مدیریت شده‌اند قابل مشاهده هستند.
  • برخی هدرهای پیش‌فرض (مثلاً Content-Type) ممکن است به صورت خودکار توسط PHP یا فریم‌ورک تنظیم شوند؛ برای تغییر آن از header() استفاده کنید.
  • در هنگام لاگ‌برداری یا تست APIها، headers_list() ابزار خوبی برای اعتبارسنجی هدرها و محتوای امنیتی (CSP، HSTS و …) است.
  • به تزریق هدر (Header Injection) دقت کنید: متغیرهایی که در header() قرار می‌دهید باید پاکسازی (sanitize) شوند تا از حملات جلوگیری شود.

موارد پیشرفته و نمونهٔ عملی

فرض کنید می‌خواهید در middleware قبل از ارسال پاسخ، هدرهای امنیتی لازم را اضافه یا اصلاح کنید و همچنین از نبود هدرهای تکراری مطمئن شوید:

// middleware.php (نمونه)
function apply_security_headers() {
    // حذف هدرهای مشابه قبلی
    header_remove('X-Frame-Options');
    // افزودن هدرهای امنیتی
    header('X-Frame-Options: SAMEORIGIN');
    header('X-Content-Type-Options: nosniff');
    // بررسی نهایی برای لاگ یا دیباگ
    error_log(print_r(headers_list(), true));
}

توضیح: در این middleware ابتدا هر هدر X-Frame-Options را حذف کرده و سپس مقدار مطلوب را اضافه می‌کنیم تا از مقادیر تکراری یا ناسازگار جلوگیری شود. در پایان فهرست هدرها لاگ می‌شود تا مدیر سیستم یا توسعه‌دهنده بتواند بررسی کند چه هدرهایی ارسال خواهند شد.

جمع‌بندی

تابع headers_list() ابزار مفیدی برای مشاهدهٔ هدرهای آمادهٔ ارسال در PHP است. از این تابع می‌توان برای دیباگ، بررسی ناسازگاری هدرها، و مدیریت هوشمند هدرها در لایه‌های مختلف اپلیکیشن استفاده کرد. همواره به امنیت، ترتیب ارسال هدرها و تعامل با وب‌سرور توجه داشته باشید و از تابع‌های مکمل مانند headers_sent()، header_remove() و بافر خروجی بهره ببرید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: