ویژگی تصویر

تابع header_remove() در PHP

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

تابع header_remove() در PHP به شما این امکان را می‌دهد که هدرهای HTTP که توسط PHP آماده‌سازی یا قبلاً با تابع header() فرستاده شده‌اند را قبل از ارسال به کلاینت حذف کنید. این تابع مخصوصاً در مواقعی مفید است که بخواهید هدرهای پیش‌فرض را تغییر دهید، هدرهای تکراری را پاک کنید یا هدرهای حساس مثل X-Powered-By را حذف نمایید.

ساختار و نحوهٔ فراخوانی

تابع header_remove دارای این امضاست:

void header_remove([ string $name ] )

اگر پارامتر name را ندهید، تابع تمام هدرهای تنظیم‌شده توسط PHP را حذف می‌کند. اگر نام هدر مشخص شود، فقط آن هدر (یا همهٔ نمونه‌های آن) حذف می‌گردد. توجه داشته باشید که این تابع مقدار بازگشتی ندارد (void).

مثال ساده: حذف یک هدر مشخص

<?php
// تنظیم یک هدر تست
header('X-Test-Header: value');

// مشاهدهٔ هدرها قبل از حذف
var_dump(headers_list());

// حذف هدر مشخص
header_remove('X-Test-Header');

// مشاهدهٔ هدرها بعد از حذف
var_dump(headers_list());
?>

در این کد ابتدا هدر X-Test-Header تنظیم می‌شود، سپس خروجی headers_list() نشان می‌دهد این هدر در لیست قرار دارد. با فراخوانی header_remove(‘X-Test-Header’)، آن هدر از لیست داخلی حذف می‌شود و نمایش بعدی headers_list() دیگر آن را نشان نمی‌دهد. توجه کنید که نتیجهٔ نهایی در هدرهایی که واقعاً به مرورگر ارسال می‌شوند تنها در صورتی تغییر خواهد کرد که هنوز هیچ خروجی باینری (مثل echo یا فضاهای قبل از تگ <?php) ارسال نشده باشد.

حذف همهٔ هدرها

<?php
header('X-A: foo');
header('X-B: bar');

var_dump(headers_list()); // نشان‌دهندهٔ وجود X-A و X-B

// حذف همهٔ هدرها
header_remove();

var_dump(headers_list()); // اکنون لیست خالی است (یا فقط هدرهایی که توسط SAPI اضافه شده‌اند باقی‌مانند)
?>

فراخوانی تابع بدون آرگومان تمام هدرهای ثبت شده را از لیست داخلی PHP پاک می‌کند. دقت کنید در برخی SAPIها (مثلاً وقتی وب‌سرور خودش هدرهایی اضافه می‌کند) ممکن است هدرهایی توسط وب‌سرور نیز به‌گونه‌ای ارسال شوند که قابل حذف توسط PHP نباشند.

موارد کاربرد عملی

  • حذف هدرهای پیش‌فرض مانند X-Powered-By برای کاهش اطلاعات سرور و بالا بردن امنیت.
  • جلوگیری از ارسال هدرهای کش ناخواسته هنگام فرستادن پاسخ API یا فایل دانلودی.
  • حذف هدرهای تکثیر شده که ممکن است توسط کدهای کتابخانه یا لایه‌های مختلف فریم‌ورک اضافه شده باشند.
  • اصلاح هدرها در middleware یا قبل از ارسال پاسخ بدون نیاز به تغییر تنظیمات سرور.

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

  • باید قبل از ارسال هر خروجی باشد: header_remove مانند header تنها زمانی مؤثر است که headers_sent() هنوز false باشد. اگر خروجی (حتی یک کاراکتر فاصله) ارسال شده باشد، دیگر نمی‌توانید هدرها را حذف یا تغییر دهید.
  • قابلیت حذف هدرهای اضافه‌شده توسط وب‌سرور محدود است: برخی هدرها ممکن است توسط وب‌سرور (Apache/Nginx) یا ماژول‌های آن تنظیم شده باشند و PHP نتواند آنها را حذف کند.
  • نام هدرها حساس به حروف نیست: نام هدرها در HTTP غیرحساس به حروف است؛ header_remove معمولاً نام را به‌صورت غیرحساس به حروف پردازش می‌کند.
  • حذف چند نمونه از یک هدر: اگر چند مقدار از یک نام هدر وجود داشته باشد (header با replace=false)، header_remove نام مربوطه را حذف می‌کند و معمولاً همهٔ نمونه‌ها را پاک می‌نماید.
  • نسخهٔ PHP و رفتار SAPI: رفتار دقیق ممکن است بین نسخه‌های PHP و SAPIهای مختلف تفاوت داشته باشد. همیشه در محیط‌های تولیدی تست نمایید.

مقایسهٔ سریع: توابع مرتبط

تابعکاربرد
header()اضافه یا جایگزینی یک هدر HTTP
header_remove()حذف یک هدر مشخص یا تمام هدرها
headers_list()دریافت آرایه‌ای از هدرهای آماده برای ارسال
headers_sent()بررسی اینکه آیا هدرها قبلاً ارسال شده‌اند یا خیر

مثال کاربردی: API با JSON و بدون کش

<?php
// اطمینان از اینکه هیچ خروجی قبلاً ارسال نشده
if (headers_sent()) {
    http_response_code(500);
    echo json_encode(['error' => 'Headers already sent']);
    exit;
}

// حذف هدرهای حساس یا ناخواسته
header_remove('X-Powered-By');
header_remove('X-AspNet-Version'); // اگر از سرویس‌هایی آمده باشد

// تنظیم هدرهای مناسب برای پاسخ JSON بدون کش
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');

// خروجی JSON
echo json_encode(['status' => 'ok']);
?>

در این سناریو ابتدا بررسی می‌کنیم آیا هدرها ارسال شده‌اند یا خیر. سپس هدرهای ناخواسته مانند X-Powered-By حذف می‌شوند و هدرهای مناسب برای پاسخ JSON و غیرفعال کردن کش تنظیم می‌گردد.

راهنمای رفع اشکال و بهترین شیوه‌ها

  • همیشه قبل از هر خروجی از headers_sent() استفاده کنید یا از ob_start() برای بافر کردن خروجی بهره ببرید.
  • برای حذف دائمی هدرهای پیش‌فرض مانند X-Powered-By، بهتر است php.ini (expose_php = Off) را تنظیم کنید تا از سطح PHP حذف شود.
  • برای دیباگ، headers_list() را فراخوانی و لیست را بررسی کنید تا بفهمید چه هدرهایی قبل از ارسال وجود دارند.
  • برای امنیت بیشتر، حذف هدرهای اطلاعات‌دهندهٔ نسخه سرور را در محیط تولیدی در نظر بگیرید.

در مجموع header_remove() ابزار کاربردی و ساده‌ای برای کنترل هدرهای خروجی در PHP است، اما برای نتیجهٔ قابل‌اطمینان باید دقت کنید که چه زمانی آن را فراخوانی می‌کنید و کدام هدرها توسط وب‌سرور یا سایر لایه‌ها اضافه شده‌اند.

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

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