یک سری توابع هستن که هدرهای مرورگرو (Http-Header) تغییر میدن و مرورگر طبق این هدر ها عمل میکنه.
چنتا ازین توابع:
- ()header() - header_remove
- ()session_start() - session_regenerate_id
- ()setcookie() - setrawcookie
هدرها تا زمانی قادرن تغییر کنن که هیچ خروجی (حتی یک space) در صفحه ی مرورگر چاپ نشده باشه.یعنی هیچ داده ای از سمت سرور به مرورگر کاربر نرسیده باشه.
مثلا کد زیر غلطه:
<html>
<?php
session_start();
?>
علتش بخاطر وجود تگ html هست.چون قبل ازینکه سشن استارت بشه , تگ html در صفحه ی مرورگر چاپ شده و باعث بروز این مشکل میشه.
اگر بجای تگ html یک فاصله(space) هم بود بازم همین مشکل وجود داشت.
راه حل:
- قبل از این توابع چیزی چاپ نشه.از قبیل echo , print , html tag ,...
- فایل با انکد utf-8 without byte order mark ذخیره بشه.(utf-8 without BOM)
چون utf-8 سه بایت(0xEF, 0xBB, 0xBF) به ابتدای فایل اضافه میکنه که با توجه به توضیحات بالا مشکل ساز میشه.
- استفاده از بافر خروجی (ob_start) - حتما نیاز نیست ازین راه استفاده بشه.
* زمانی که بافر فعال بشه , تمام دیتاهایی که قراره در مرورگر کاربر چاپ بشه , ابتدا در بافر روی حافظه رم سرور قرار میگیره و تا زمانی که دستور خالی کردن بافرو ندادیم (ob_end_flush) , چیزی در مرورگر چاپ نمیشه.
- زمان استفاده از header برای عمل redirect صفحه , ممکنه زیاد با این خطا مواجه بشیم.
تابعی که استفاده میکنیم برای redirect:
header('location: index.php');
اما راه حل جایگزین برای redirect :
- با استفاده از جاوااسکریپت:
<?php echo "<script>window.location = 'index.php'</script>"; ?>
- با استفاده از تگ متا:
<?php echo "<meta http-equiv='Refresh' content='0; url=index.php'>"; ?>
- استفاده از تابع زیر:
function redirect($url) { @header('location: ' . $url); exit('<meta http-equiv="Refresh" content="0;url='. $url .'">'); }
این لینک لیستی از هدر های درخواست رو نشون میده. بطور مثال (content-type , location , referesh , ....)