header:

هدرها یا سرایندها:

شاید خیلی از شما با تابع header آشنا هستید ولی معمولا اکثر برنامه نویسان تازه کار این تابع رو فقط برای هدایت کاربر به یک صفحه دیگه ، استفاده می کنند در حالی که اینطور نیست و هدایت به صفحات فقط یکی از کاربردهای این تابع میباشد.

اجازه بدید وظیفه اصلی این تابع رو خدمتتون بگم ، همونطورکه از اسم این تابع برمیاد وظیفه اش تغییر اطلاعات هدر صفحات هست ! البته منظورم اون هدری که با تگهای اچ تی ام الی ایجاد می کنید نیست بلکه اطلاعاتی که همراه صفحات برای مرورگر کلاینت ارسال میشه ! بله همونطور که گفتم وقتی یک کاربری با مرورگرش درخواست یک صفحه رو به یک سرور ارسال میکنه ، سرور در پاسخ به این درخواست یک صفحه رو آماده می کنه و براش میفرسته که در کنار اطلاعات صفحه ، یکسری اطلاعات دیگه هم به مرورگر کلاینت ارسال می کنه که بهش میگن " هدر "

حالا ممکنه از خودتون بپرسید این اطلاعات چی هستند؟! این اطلاعات یکسری از خصوصیت ها هستند که سرور برای مرورگر کاربر میفرسته تا مرورگر اون صفحه ارسال رو بطور صحیح اجرا کنه و نشون بده ، مثلا سرور درون اطلاعات هدر نوع فایل ارسالی اش رو به مرورگر مشخص میکنه ، زمان انقضای ارتباط اش به مرورگر رو براش میفرسته ، نسخه php رو میگه ، نسخه و ویژگی وب سرور رو میگه ، مسیر دقیق دانلود فایل رو مشخص میکنه و از این دست موارد که دلیل ارسال این اطلاعات هم همونطورکه گفتم برای ارتباط بهتر دو طرف هست (یعنی برنامه وب سرور و مرورگر کلاینت)

حالا ما برنامه نویسان معمولا در اکثر مواقع نیازی به تغییر این اطلاعات نداریم و خود سرور این هدر رو تولید میکنه و ضمیمه فایل درخواستی برای مرورگر کاربر میفرسته ولی در بعضی مواقع هم لازم میشه تا ما خودمون این اطلاعات هدر رو تغییر بدیم که برای اینکار تابعی بنام ()header در زبان php در نظر گرفته شده که ما میتونیم با دادن پارامترهای مختلف به تابع header بخش مورد نظرمون رو از هدر تغییر بدیم.

نکته مهم:

هدرها حتما باید اولین خط فرمان خروجی برنامه باشند وگرنه برنامه ارور میدهد.

یک راه حل دیگر هم وجود دارد که با مثال زیر متوجه خواهید شد:

<?php
ob_start();
?>
<html>
<header>
....
</header>
<boby>
HTML and Your page Design Code
<?php
if ( ($user=='admin') && ($pass=='123') ){
	ob_end_clean();
	header("Location: inbox.php");
	exit;
}else{
	ob_end_clean();
	header("Location: invalid.php");
	exit;
}
?>
<body>

توسط فرمان ob_end_clean شما بافر را تخلیه می کنید و حال می توانید Header‌ را تغییر دهیدو البته حتما باید مانند استفاده از Session در ابتدای صفحه ، اول اول اون را استارت کنید. به مثال توجه کنید.

نکته:

بهتر است بعد از ارسال هدر های اینچنینی متد die بعد از ان قرار دهید تا برنامه متوقف شود.

برای مشاهده هدر های صفحه کافی است از دستور

print_r(header_list());

استفاده کنید که لیست هدر های ارسال شده به مرورگر را مشاهده خواهید کرد خروجی ممکن است به شکل زیر باشد

array(2) {
  [0]=>
  string(23) "X-Powered-By: PHP/1.0.0"
  [1]=>
  string(22) "myvalue: ghfh-56555-ss"
}

که در واقع شامل یک مقدار پیشفرض x_powered_by می باشد که زبان برنامه نویسی سایت مشخص میکند و در قسمت بعدی muvalue یک هدری می باشد که خودمان ارسال کرده ایم اما چطور؟

برای ارسال هدر دلخواه به مرورگر کافیست از کد زیر استفاده کنید.

header("name: value");

همان طور که میبینید با فراخوانی تابع header و دستور txt ان به صورت name: value می توان یک هدر ارسال کرد.

حالا اگر بخواهیم یک هدر را تغییر دهیم؟

کافیست همان هدر با همان نام ارسال کنید اما مقدار ان را عوض کنید برای مثال اگر بخواهیم کسی نفهمد که از php استفاده کرده ایم کافیست کد زیر را ارسال کنید.

header("X-Powered-By: html");

البته این کار دستور برای کار بالا خیلی ابتدایی بوده و خیلی رایج نیست.

جلوگیری از کش صفحه با ارسال header :

<?php
// یک تاریخ منقضی شده
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
?>

تازه سازی صفحه refresh با ارسال هدر :

header('refresh:2');

با کد بالا بعد از دوثانیه صفحه تازه سازی میشود.

انتقال و یا ریدارکت صفحه:

header('location: http://www.google.com');

با این کار با اجرا صفحه شما به گوگل منتقل میشوید! اما اگر بخواهید کمی زمان بگذرد و بعد انتقال انجام شود دستور زیر را استفاده کنید.

header('refresh:3;url=www.google.زom')

با کد بالا صفحه بعد از ۳ ثانیه به گوگل منتقل خواهد شد.

تعیین نوع محتوای صفحه با استفاده از هدها:

در حالت عادی صفحه به صورت معمولی لود میشود ولی گاهی نیاز است که نوع صفحه به حالت های مختلفی تغییر کند. مثلا زمانی که میخواهیم با همان ادرس سایت به کاربر لینک دانلود فایلی را بدهیم یا عکسی را لود کنیم در این حالت از هدر استفاده میکنیم.

مثال زیر در همان ادرس یک فایل تصویری لود میشود بدون انکه کاربر ادرس واقعی تصویر را ببیند.

<?php
header("Content-Type: image/png");
header("Content-Disposition: attachment; filename=faradars.png");
readfile("files/faradars.png");

در مثال زیر به صورت پویا نوع فایل را مشخص میکنیم:

<?php
error_reporting(E_ALL ^ E_NOTICE);
$id = $_GET['id'];
switch($id) {
    case 1:
        $filename = 'a.txt';
        $type = 'text/plain';
        break;
    
    case 2:
        $filename = 'data.rar';
        $type = 'application/x-compressed';
        break;
    
    case 3:
        $filename = 'faradars.png';
        $type = 'image/png';
        break;
}
if(is_null($filename)) {
    http_response_code(404);
    die('File not found!');
}
header("Content-Type: $type");
header("Content-Disposition: attachment; filename=$filename");

readfile("files/$filename");
    

انواع مختلف Content-Type

header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain; charset=utf-8');
header('Content-Type: text/css; charset=utf-8');
header('Content-Type: text/csv; charset=utf-8');
header('Content-Type: text/tab-separated-values; charset=utf-8');
header('Content-Type: application/xml; charset=utf-8');
header('Content-Type: application/rss+xml; charset=utf-8');
header('Content-Type: application/json; charset=utf-8');
header('Content-Type: application/pdf');
header('Content-Type: image/jpeg');
header('Content-Type: image/png');
header('Content-Type: image/gif');