محسن موحد (آموزش برنامه نویسی)
محسن موحد (آموزش برنامه نویسی)
خواندن ۱ دقیقه·۳ سال پیش

خطای Cannot modify header information - headers already sent by

ریدایرکت در سه وضعیت 301 - 302 - 303
ریدایرکت در سه وضعیت 301 - 302 - 303


یک سری توابع هستن که هدرهای مرورگرو (Http-Header) تغییر میدن و مرورگر طبق این هدر ها عمل میکنه.

چنتا ازین توابع:

  • ()header() - header_remove
  • ()session_start() - session_regenerate_id
  • ()setcookie() - setrawcookie

هدرها تا زمانی قادرن تغییر کنن که هیچ خروجی (حتی یک space) در صفحه ی مرورگر چاپ نشده باشه.یعنی هیچ داده ای از سمت سرور به مرورگر کاربر نرسیده باشه.
مثلا کد زیر غلطه:

<html> <?php session_start(); ?>

علتش بخاطر وجود تگ html هست.چون قبل ازینکه سشن استارت بشه , تگ html در صفحه ی مرورگر چاپ شده و باعث بروز این مشکل میشه.
اگر بجای تگ html یک فاصله(space) هم بود بازم همین مشکل وجود داشت.

راه حل:

  1. قبل از این توابع چیزی چاپ نشه.از قبیل echo , print , html tag ,...
  2. فایل با انکد utf-8 without byte order mark ذخیره بشه.(utf-8 without BOM)
    چون utf-8 سه بایت(0xEF, 0xBB, 0xBF) به ابتدای فایل اضافه میکنه که با توجه به توضیحات بالا مشکل ساز میشه.
  3. استفاده از بافر خروجی (ob_start) - حتما نیاز نیست ازین راه استفاده بشه.
    * زمانی که بافر فعال بشه , تمام دیتاهایی که قراره در مرورگر کاربر چاپ بشه , ابتدا در بافر روی حافظه رم سرور قرار میگیره و تا زمانی که دستور خالی کردن بافرو ندادیم (ob_end_flush) , چیزی در مرورگر چاپ نمیشه.
  4. زمان استفاده از header برای عمل redirect صفحه , ممکنه زیاد با این خطا مواجه بشیم.

تابعی که استفاده میکنیم برای redirect:

header('location: index.php');

اما راه حل جایگزین برای redirect :

  1. با استفاده از جاوااسکریپت:
<?php echo &quot = 'index.php'" ?>
  1. 0 => یعنی بعد از 0 ثانیه این عمل انجام شود.با استفاده از تگ متا:
<?php echo &quot<meta http-equiv='Refresh' content='0; url=index.php'>" ?>
  1. استفاده از تابع زیر: (بهترین راه)
function redirect($url) { @header('location: ' . $url); exit('<meta http-equiv=&quotRefresh&quot content=&quot0;url='. $url .'&quot>'); }


اما برای مدیریت ریدایرکت های دائمی یا موقتی یا وضعیت 303:

function redirect($url, $statusCode = 303) { header('Location: ' . $url, true, $statusCode); die(); }




این لینک لیستی از هدر های درخواست رو نشون میده. بطور مثال (content-type , location , refresh , ....)

منبع: محسن موحد

phpheaderoutput bufferingبرنامه نویسیredirect
برنامه نویس متخصص PHP، Mysql، Javascript، HTML، CSS، Node.js، Android، Laravel، Yii2 - مدیر پشتیبانی فنی و سرپرست منتورها در شرکت 7learn.com
شاید از این پست‌ها خوشتان بیاید