ویژگی تصویر

تابع header() در PHP

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

تابع header() یکی از ابزارهای پایه‌ای در PHP برای ارسال هدرهای HTTP به مرورگر یا کلاینت است. با این تابع می‌توانید نوع محتوا، هدایت (redirect)، کش و کنترل‌های مختلف HTTP را تنظیم کنید. در این مقاله به صورت جامع کاربردها، نکات امنیتی، خطاهای رایج و مثال‌های عملی را بررسی می‌کنیم.

معنی و عملکرد پایه

تابع header() یک هدر خام به خروجی HTTP اضافه می‌کند. این کار باید قبل از هر خروجی (مثل echo یا فضای سفید قبل از <?php) انجام شود؛ در غیر این صورت خطای “Headers already sent” رخ می‌دهد. همچنین می‌توان با پارامترهای اضافه وضعیت HTTP را مشخص کرد.

قالب پایه

header(string $header, bool $replace = true, int $response_code = 0);

توضیح: پارامتر اول رشته هدر، پارامتر دوم تعیین می‌کند آیا هدرهای قبلی با همین نام جایگزین شوند یا خیر، و پارامتر سوم برای ارسال کد وضعیت HTTP (مثلاً 301، 404).

مثال‌های پرکاربرد

  • ریدایرکت معمولی (302 یا 301)
    // Temporary redirect
    header("Location: https://example.com/newpage.php");
    exit();
    
    // Permanent redirect (301)
    header("Location: https://example.com/newpage.php", true, 301);
    exit();
    

    توضیح: بعد از ارسال هدر Location همواره از exit یا die استفاده کنید تا اجرای اسکریپت متوقف شود. پارامتر سوم 301 باعث ارسال статус “Moved Permanently” می‌شود.

  • تنظیم نوع محتوا (Content-Type)
    // JSON response
    header("Content-Type: application/json; charset=utf-8");
    echo json_encode($data);
    exit();
    

    توضیح: مشخص کردن charset برای جلوگیری از مشکلات کدگذاری مهم است. برای پاسخ‌های API معمولاً Content-Type مناسب (مثلاً application/json) ارسال می‌شود.

  • دانلود فایل (Content-Disposition)
    // Force file download
    $file = '/path/to/report.pdf';
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename="report.pdf"');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit();
    

    توضیح: Content-Disposition با مقدار attachment باعث می‌شود مرورگر فایل را دانلو‌د کند. برای ایمن‌تر کردن نام فایل از rawurlencode یا توابع مشابه استفاده کنید تا از header injection جلوگیری شود.

  • کنترل کش
    // Prevent caching
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Pragma: no-cache");
    header("Expires: 0");
    

    توضیح: این هدرها برای صفحات پویا یا داده‌های حساس کاربرد دارند تا مرورگر و میانی‌ها (proxies) محتوا را کش نکنند.

  • CORS (دسترسی بین‌منبعی)
    // Allow Cross-Origin requests (use cautiously)
    header("Access-Control-Allow-Origin: https://example.com");
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    

    توضیح: هدر Access-Control-Allow-Origin باید با دقت تنظیم شود تا ریسک‌های امنیتی کاهش یابد؛ استفاده از “*” برای سایت‌های حساس توصیه نمی‌شود.

جدول نمونه هدرهای متداول و کاربرد

هدرکاربرد
Locationریدایرکت به URL دیگر
Content-Typeتعریف نوع و charset محتوا
Content-Dispositionاجبار به دانلود یا نمایش فایل
Cache-Control / Pragma / Expiresکنترل کش مرورگر و پراکسی
Access-Control-Allow-Originتنظیم CORS

خطاها و رفع آن‌ها

  • Headers already sent: علت معمولاً خروجی قبل از فراخوانی header است؛ بررسی فایل‌ها برای فضای سفید یا BOM ضروری است. راه‌حل دیگر استفاده از output buffering است: ob_start();
  • Header injection: اگر مقادیر کاربر مستقیماً در هدر قرار گیرند، ممکن است مهاجم هدر جدید یا محتوای مخرب اضافه کند. همیشه ورودی را فیلتر یا encode کنید.

مثال ایمن‌سازی ریدایرکت (جلوگیری از Open Redirect)

// Safe redirect: allow only internal paths
$target = $_GET['next'] ?? '/';
$allowedPrefixes = ['/dashboard', '/profile', '/help'];
$valid = false;
foreach ($allowedPrefixes as $p) {
    if (strpos($target, $p) === 0) {
        $valid = true;
        break;
    }
}
if (!$valid) {
    $target = '/';
}
header("Location: " . $target, true, 302);
exit();

توضیح: به‌جای قبول هر URL از ورودی، لیستی از مسیرهای مجاز تعریف شده است تا از بازشدن ریدایرکت به سایت‌های خارجی جلوگیری شود.

توابع مرتبط و بهترین شیوه‌ها

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

نکات امنیتی و کارایی

  • هر زمان از مقادیر کاربر در هدرها استفاده می‌کنید، از فیلترها و encode مناسب استفاده کنید (مثل rawurlencode برای نام فایل).
  • پس از header(“Location: …”) همواره exit کنید تا اجرای بقیه اسکریپت متوقف شود.
  • از ارسال هدرهای حساس (مانند Access-Control-Allow-Origin) با مقدار “*” در محیط تولید محافظت شده خودداری کنید.
  • برای جلوگیری از خطای headers already sent، کد PHP را بدون خروجی غیرضروری یا از ob_start() استفاده کنید.

جمع‌بندی سریع

تابع header() یک ابزار قدرتمند برای کنترل رفتار HTTP در PHP است. با فهم درست پروتکل HTTP، رعایت نکات امنیتی و استفاده از توابع کمکی مثل headers_sent() و http_response_code() می‌توانید پاسخ‌های قابل اعتماد، امن و بهینه ارسال کنید.

در صورت نیاز به مثال خاص‌تر (مثلاً ارسال فایل‌های بزرگ با chunking، یا تنظیم هدرهای امنیتی HSTS و CSP) می‌توان مثال‌های تکمیلی و بهینه‌سازی‌های عملکردی ارائه کرد.

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

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