PHP da allaqachon yuborilgan sarlavhalarni qanday tuzatish mumkin

Skriptimni ishga tushirayotganda men bir nechta xatolarni olaman:

Ogohlantirish: Sarlavha ma'lumotlarini o'zgartirib bo'lmaydi - sarlavhalar allaqachon yuborilgan (chiqish /some/file.php:12) /some/file.phpda satrda 23

Xato xabarlarida qayd etilgan qatorlar header() va setcookie() qo'ng'iroqlar.

Buning sababi nima bo'lishi mumkin? Va uni qanday tuzatish kerak?


person Community    schedule 06.11.2011    source manba
comment
o'qing: stackoverflow.com/questions/1912029/   -  person Book Of Zeus    schedule 06.11.2011
comment
Hech qanday matn chiqmaganligiga ishonch hosil qiling (ob_start va ob_end_clean() bu yerda foydali boʻlishi mumkin). Keyin ob_get_contents() ga teng cookie yoki seans o'rnatishingiz va keyin buferni tozalash uchun ob_end_clean() dan foydalanishingiz mumkin.   -  person Jack    schedule 04.04.2014
comment
PHP kutubxonamdagi safeRedirect funksiyasidan foydalaning: github.com/heinkasner/PHP -Library/blob/master/extra.php   -  person heinkasner    schedule 24.07.2014
comment
~~~~~~~~~~ Sizning KODLASH faylingiz UTF-8 bo'lmasligi kerak, lekin UTF-8 (Without BOM)~~~~~~~~~~~   -  person T.Todua    schedule 19.09.2014


Javoblar (11)


Sarlavhalarni yuborishdan oldin chiqish yo'q!

HTTP sarlavhalarini yuboruvchi/o'zgartiruvchi funksiyalarhar qanday chiqishdan oldinchaqirilishi kerak. xulosa ⇊ Aks holda qo‘ng‘iroq bajarilmaydi:

Ogohlantirish: Sarlavha maʼlumotlarini oʻzgartirib boʻlmaydi – sarlavhalar allaqachon yuborilgan (chiqish script:line da boshlangan)

HTTP sarlavhasini o'zgartiruvchi ba'zi funktsiyalar:

Chiqish bo'lishi mumkin:

  • Qasddan:

    • print, echo and other functions producing output
    • <?php kodidan oldingi <html> bo'lim.

Nima uchun bu sodir bo'ladi?

Nima uchun sarlavhalar chiqishdan oldin yuborilishi kerakligini tushunish uchun odatdagi HTTP javobini ko'rib chiqish kerak. PHP skriptlari asosan HTML kontentini yaratadi, lekin HTTP/CGI sarlavhalari toʻplamini veb-serverga uzatadi:

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

Sahifa/chiqish har doim sarlavhalardan kuzatib boradi. PHP avval sarlavhalarni veb-serverga o'tkazishi kerak. Buni faqat bir marta qilish mumkin. Ikki qatorli uzilishdan keyin u ularni hech qachon o'zgartira olmaydi.

PHP birinchi chiqishni qabul qilganda (print, echo, <html>) barcha yigʻilgan sarlavhalarni tozalaydi. Shundan so'ng u barcha kerakli natijalarni yuborishi mumkin. Ammo keyin boshqa HTTP sarlavhalarini yuborish mumkin emas.

Erta chiqish qaerda sodir bo'lganligini qanday aniqlash mumkin?

header() ogohlantirish muammo sababini aniqlash uchun barcha tegishli ma'lumotlarni o'z ichiga oladi:

Ogohlantirish: Sarlavha ma'lumotlarini o'zgartirib bo'lmaydi - sarlavhalar allaqachon tomonidan yuborilgan(chiqaruv /www/usr2345/htdocs/auth.php:52da boshlangan) /www/usr2345/htdocs/index.php 100-qatorda

Bu erda 100-qator header() chaqiruv muvaffaqiyatsiz bo'lgan skriptga ishora qiladi.

Qavs ichidagi chiqishda boshlangan yozuv muhimroq. Bu avvalgi ishlab chiqarish manbasini ko'rsatadi. Bu misolda bu auth.php va satr 52. Bu erda siz erta chiqishni izlashingiz kerak edi.

Odat sabablari:

  1. Chop etish, aks-sado

    print va echo bayonotlaridan ataylab chiqish HTTP sarlavhalarini yuborish imkoniyatini to'xtatadi. Bunga yo'l qo'ymaslik uchun dastur oqimi qayta tuzilishi kerak. funksiyalar va shablon sxemalaridan foydalaning. Xabarlar yozilishidan oldin header() qo'ng'iroqlar sodir bo'lishiga ishonch hosil qiling.

    Chiqarish ishlab chiqaradigan funktsiyalar kiradi

    • print, echo, printf, vprintf
    • trigger_error, ob_flush, ob_end_flush, var_dump, print_r
    • readfile, passthru, flush, imagepng, imagejpeg


    boshqalar va foydalanuvchi tomonidan belgilangan funktsiyalar.

  2. Raw HTML hududlari

    .php faylidagi tahlil qilinmagan HTML bo'limlari ham bevosita chiqariladi. header() chaqiruvini ishga tushiradigan skript shartlari har qanday xom <html> bloklaridan oldin qayd etilishi kerak.

    <!DOCTYPE html>
    <?php
        // Too late for headers already.
    

    Chiqish mantig'idan ishlov berishni ajratish uchun shablonlash sxemasidan foydalaning.

    • Place form processing code atop scripts.
    • Xabarlarni kechiktirish uchun vaqtinchalik string o'zgaruvchilardan foydalaning.
    • Haqiqiy chiqish mantig'i va aralash HTML chiqishi oxirgi bo'lishi kerak.

  3. script.php 1-qator ogohlantirishlari uchun <?php oldidan boʻsh joy

    Agar ogohlantirish 1 qatoridagi chiqishga tegishli boʻlsa, u asosan ochilish <?php belgisi oldidagi boʻsh joy, matn yoki HTMLga olib keladi.

     <?php
    # There's a SINGLE space/newline before <? - Which already seals it.
    

    Xuddi shunday, qo'shilgan skriptlar yoki skript bo'limlari uchun ham sodir bo'lishi mumkin:

    ?>
    
    <?php
    

    PHP aslida teglarni yopishdan so'ng bitta qator uzilishini yeydi. Ammo u bir nechta yangi qatorlar yoki yorliqlar yoki bunday bo'shliqlarga o'tkazilgan bo'shliqlarni qoplamaydi.

  4. #P64# #P23# #P24# joes muharriri UTF-8 BOMni ko'rsatmoqda  to'ldiruvchi va MC muharriri nuqta #P25# beav hexseditor ko'rsatuvchi utf #P26# #P65# #P27#
    phptags  --whitespace  *.php
    
    #P28#
  5. ?> dan keyin boʻsh joy

    Agar xato manbasi yopilish ?> orqasida aytilgan bo'lsa, bu erda bo'sh joy yoki xom matn paydo bo'ladi. yozilgan. PHP yakuniy belgisi bu nuqtada skriptning bajarilishini to'xtatmaydi. Undan keyingi har qanday matn/boʻsh joy hali ham sahifa mazmuni sifatida yoziladi.

    Odatda, ayniqsa, yangi kelganlarga, keyingi ?> PHP yopish teglaridan voz kechish tavsiya etiladi. Bu ushbu holatlarning kichik qismini eslatadi. (Ko'pincha include()d skriptlar aybdor.)

  6. 0-qatorda noma'lum deb qayd etilgan xato manbasi

    Agar xato manbasi aniqlanmagan bo'lsa, bu odatda PHP kengaytmasi yoki php.ini sozlamasidir.

    • It's occasionally the gzip stream encoding setting or the ob_gzhandler.
    • Lekin bu, shuningdek, PHP ni ishga tushirish/ogohlantirish xabarini ishlab chiqaruvchi har qanday ikki marta yuklangan extension= moduli ham boʻlishi mumkin.

  7. Oldingi xato xabarlari

    Agar boshqa PHP bayonoti yoki ifodasi ogohlantirish xabari yoki bildirishnomaning chop etilishiga sabab bo'lsa, bu ham muddatidan oldin chiqarilgan deb hisoblanadi.

    Bunday holda siz xatodan qochishingiz, bayonotning bajarilishini kechiktirishingiz yoki xabarni bosishingiz kerak. isset() yoki @()< /a> - keyinchalik nosozliklarni tuzatishga to'sqinlik qilmasa.

Xato xabari yoʻq

Agar sizda php.ini uchun error_reporting yoki display_errors o'chirilgan bo'lsa, hech qanday ogohlantirish ko'rsatilmaydi. Ammo xatolarga e'tibor bermaslik muammoni hal qilmaydi. Sarlavhalarni muddatidan oldin chiqqandan keyin ham yuborish mumkin emas.

Shunday qilib, header("Location: ...") yo'naltirishlari jimgina bajarilmasa, ogohlantirishlarni tekshirish tavsiya etiladi. Chaqiruv skripti ustidagi ikkita oddiy buyruq bilan ularni qayta yoqing:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Yoki hammasi bajarilmasa set_error_handler("var_dump");.

Qayta yo'naltirish sarlavhalari haqida gapiradigan bo'lsak, siz ko'pincha oxirgi kod yo'llari uchun shunday idiomadan foydalanishingiz kerak:

exit(header("Location: /finished.html"));

Hatto header() xatolik yuz berganda foydalanuvchi xabarini chop etadigan yordamchi funksiya ham afzalroq.

Vaqtinchalik yechim sifatida chiqish buferi

PHP chiqishni buferlash bu muammoni bartaraf etishning vaqtinchalik yechimidir. U ko'pincha ishonchli ishlaydi, lekin dasturni to'g'ri tuzish va chiqishni boshqarish mantig'idan ajratish o'rnini bosa olmaydi. Uning asl maqsadi veb-serverga bo'lakli o'tkazmalarni minimallashtirishdir.

  1. Shunga qaramay, output_buffering= sozlamasi yordam berishi mumkin. Uni php.ini yoki .htaccess yoki hatto .user.ini zamonaviy FPM/FastCGI sozlamalarida.
    Uni yoqish PHP-ga chiqishni veb-serverga o'tkazish o'rniga buferlash imkonini beradi. darhol. Shunday qilib, PHP HTTP sarlavhalarini to'plashi mumkin.

  2. Uni chaqirish skripti tepasida ob_start(); ga qo‘ng‘iroq qilish ham mumkin. Biroq, bu bir nechta sabablarga ko'ra kamroq ishonchli:

    • <?php ob_start(); ?> birinchi skriptni ishga tushirsa ham, bo'sh joy yoki BOM avval aralashib ketishi mumkin, uni samarasiz qilish.

    • U HTML chiqishi uchun bo'sh joyni yashirishi mumkin. Ammo dastur mantig'i ikkilik tarkibni (masalan, yaratilgan rasm) yuborishga harakat qilishi bilanoq, buferlangan tashqi chiqish muammoga aylanadi. (Yana vaqtinchalik yechim sifatida ob_clean() talab qilinadi.)

    • Bufer hajmi cheklangan va sukut bo'yicha qoldirilganda osongina oshib ketishi mumkin. Va bu ham kamdan-kam uchraydigan hodisa emas, ta'qib qilish qiyin a> bu sodir bo'lganda.

Shuning uchun ikkala yondashuv ham ishonchsiz bo'lib qolishi mumkin, xususan, ishlab chiqish sozlamalari va/yoki ishlab chiqarish serverlari o'rtasida almashishda. Shuning uchun chiqishni buferlash keng tarqalgan bo'lib faqat qo'ltiq tayoqchasi/qat'iy vaqtinchalik yechim deb hisoblanadi.

Shuningdek, qoʻllanmadagi asosiy foydalanish misoliga va boshqalarga qarang. ijobiy va salbiy tomonlari:

Lekin u boshqa serverda ishlagan!?

Agar siz avval sarlavhalar haqida ogohlantirish olmagan boʻlsangiz, u holda php.ini chiqish buferlash sozlamasini tanlang. a> o'zgargan. Joriy/yangi serverda sozlanmagan.

headers_sent() bilan tekshirilmoqda

Sarlavhalarni yuborishingiz mumkinmi yoki yoʻqligini tekshirish uchun har doim headers_sent() dan foydalanishingiz mumkin. Bu ma'lumotni shartli chop etish yoki boshqa qayta mantiqni qo'llash uchun foydalidir.

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}

Qayta tiklashning foydali echimlari quyidagilardir:

  • HTML <meta> tegi

    Agar ilovangizni tizimli ravishda tuzatish qiyin bo'lsa, qayta yo'naltirishga ruxsat berishning oson (lekin biroz noprofessional) usuli HTML <meta> tegini kiritishdir. Qayta yo'naltirishga quyidagilar orqali erishish mumkin:

     <meta http-equiv="Location" content="http://example.com/">
    

    Yoki qisqa kechikish bilan:

     <meta http-equiv="Refresh" content="2; url=../target.html">
    

    Bu <head> bo'limidan keyin foydalanilganda noto'g'ri HTMLga olib keladi. Ko'pgina brauzerlar buni hali ham qabul qilishadi.

  • JavaScript-ni qayta yo'naltirish

    Muqobil sifatida JavaScript-ni qayta yo'naltirish dan foydalanish mumkin. sahifani qayta yo'naltirish uchun:

     <script> location.replace("target.html"); </script>
    

    Bu ko'pincha <meta> vaqtinchalik hal qilishdan ko'ra ko'proq HTMLga mos keladigan bo'lsa-da, u JavaScript-ni qo'llab-quvvatlaydigan mijozlarga tayanadi.

Haqiqiy HTTP sarlavhasi() qo'ng'iroqlari muvaffaqiyatsiz bo'lsa, ikkala yondashuv ham qabul qilinadigan zaxiralarni yaratadi. Ideal holda siz buni har doim oxirgi chora sifatida foydalanuvchilarga qulay xabar va bosiladigan havola bilan birlashtirasiz. (Masalan, http://php.net/http_redirect PECL kengaytmasi nima qiladi.)

Nima uchun setcookie() va session_start() ham ta'sir qiladi

setcookie() va session_start() ham Set-Cookie: HTTP sarlavhasini yuborishi kerak. Shuning uchun bir xil shartlar qo'llaniladi va shunga o'xshash xato xabarlari muddatidan oldin chiqish holatlari uchun yaratiladi.

(Albatta, ularga brauzerda o‘chirilgan cookie-fayllar yoki hatto proksi-server bilan bog‘liq muammolar ham ta’sir qiladi. Seans funksiyasi, albatta, bo‘sh disk maydoni va boshqa php.ini sozlamalari va hokazolarga bog‘liq.)

Qo'shimcha havolalar

person mario    schedule 06.11.2011
comment
Oddiy notepad.exe ham qiyin. Men odatda fayl kodlangan bo'lsa ham, BOM qo'shmaydigan NetBeans-dan foydalanaman. Keyinchalik bloknotda faylni tahrirlash, ayniqsa, veb-server sifatida IISga nisbatan ishlarni buzadi. Ko'rinishidan, apache (asosiy qo'shilgan) BOMni tashlab yuboradi. - person Teson; 03.12.2015
comment
PHP fayllari oxiridagi ?> yopilishini olib tashlash odatda yaxshi amaliyot bo'lib, bu xatolarni ham minimallashtirishga yordam beradi. Fayllar oxirida keraksiz bo'shliq paydo bo'lmaydi va siz javobga keyinroq sarlavha qo'shishingiz mumkin bo'ladi. Agar siz chiqish buferidan foydalansangiz va qo'shilgan fayllar tomonidan yaratilgan qismlar oxirida qo'shilgan kiruvchi bo'shliqni ko'rishni xohlamasangiz ham qulay. - person Nikita 웃; 08.02.2016
comment
G'alati narsa, men faylimni cPanel Linux Hosting-dan VPS-ga ko'chirdim. Oldin u to'g'ri ishlayotgan edi, lekin bu erda bu xato ko'rsatildi. (sarlavha oldidan menda html kodi bor edi). Nega? - person Pablo Escobar; 30.04.2017
comment
@Purushotamrawat Lekin u boshqa serverda ishlagan!? haqidagi qismni o'qidingizmi? - person mario; 30.04.2017
comment
@mario, lekin men Chiqish buferini o'zgartirmadim - person Pablo Escobar; 30.04.2017
comment
@TheCrazyProfessor, chunki u mijozga biror narsa yuborishdan oldin to'liq chiqish server tomonida ko'rsatilguncha/buferlangangacha kutadi. Chiqish buferlashisiz, server ma'lumotlarni hosil bo'lishi bilan (oqimli) yuborishni boshlaydi, bu holda u avval sarlavhalarni yuborishi kerak, keyinchalik ularni boshqarib bo'lmaydi. - person huysentruitw; 16.05.2017
comment
va ba'zan bu faqat PHP versiyasi haqida! Barcha murakkab kodlarni tahrirlash juda qiyin va serveringizning PHP versiyasini kodlaringiz bilan eng mos keladigan qilib o'zgartirish yaxshiroqdir - person Solivan; 12.07.2017
comment
Sahifa yuklanganda menda allaqachon Content-Type: sarlavhasi yuklangan va yuborilgan. Qaysi sozlamalar bunga sabab bo'ldi? - person Peter S McIntyre; 01.08.2017
comment
@PeterSMcIntyre UTF8 BOM, ehtimol (buni tuzating) / chiqish buferlashi yoqilmagan (buga ishonmang). - person mario; 02.08.2017
comment
Shuni ta'kidlashni istardimki, curl dan foydalanish va CURLOPT_RETURNTRANSFER ni TRUE ga o'rnatmaslik ham natija berishi mumkin va shuning uchun "sarlavhalar allaqachon yuborilgan"-xato - person kask; 19.03.2018
comment
Boshida beixtiyor sabablarni qo'shganingiz uchun tashakkur. Kiritilgan fayllarimdan birida <?php yorlig'idan oldin bitta, kichik, kichik joy bor edi. - person AnalogWeapon; 20.05.2018
comment
Agar siz haqiqatan ham yo'naltirishdan oldin tarkibni ko'rsatishingiz kerak bo'lsa. JavaScript-da almashtirishdan foydalanishingiz mumkin: window.location.replace(newUrl.com);. Siz setTimeout() yordamida rekursiv JS funksiyasini o'rnatishingiz mumkin, u sahifada yo'naltirish vaqti kelganligini bildiruvchi ma'lumotni qidiradi va keyin qo'ng'iroqlarni almashtirish. - person Bob Ray; 05.06.2018
comment
Uchun Lekin u boshqa serverda ishlagan!? qismi -- bu mening ishim edi, agar o'zingizning mahalliy serveringiz ishlayotgan bo'lsa, php.ini faylini tahrirlashga urinib ko'ring va output_bufferingni output_buffering=4096 ga o'rnating. AGAR BU HAM ISHLAYMASA - uni oshirishga harakat qiling. Bu mening muammom edi. Men buferni 64 kb ga oshirishim kerak edi, chunki ba'zi sahifalar juda katta edi. Oh, shuningdek, har qanday holatda ham serverni qayta ishga tushirishni unutmang. - person hocikto; 24.06.2018
comment
Agar siz UltraEdit dan foydalanayotgan bo'lsangiz, Boshqacha saqlash (pastki o'ngdagi kodlash opsiyasini tanlang) UTF-8 BoM yo'q (bu men uchun tuzatildi) - person hamish; 14.07.2019
comment
Men uchun hech narsa ishlamadi, faqat bu ob_start(); muammoni hal qildi. rahmat - person Jodyshop; 16.08.2019
comment
script.php uchun ‹?php dan oldingi boʻsh joy 1-satr ogohlantirishlari men uchun ishladi. Bu ajoyib tushuntirish uchun rahmat - person Immran Mohammed; 16.03.2020
comment
Ajoyib yaxshi ishlab chiqilgan javob. - person Hillel; 19.04.2021
comment
Faqat bitta tafsilot o'tkazib yuborilgan, siz qo'shishingiz mumkin. $file = $line = null; headers_sent($file, $line); die("$file:$line");, agar xato xabari bu maʼlumotni oʻtkazib yuborsa, sarlavhalarni aynan nima yuborganini aytib beradi. Sababini bilmayman, lekin ba'zida shunday bo'lib tuyuladi. - person kmuenkel; 16.06.2021

Bu xato xabari HTTP sarlavhalarini yuborishdan oldin har qanday narsa yuborilganda ishga tushadi (setcookie yoki header). HTTP sarlavhalaridan oldin biror narsa chiqarishning umumiy sabablari:

  • Tasodifiy bo'sh joy, ko'pincha fayllar boshida yoki oxirida quyidagi kabi:

     <?php
    // Note the space before "<?php"
    ?>
    

Bunga yo'l qo'ymaslik uchun faqat yopilish ?> ni qoldiring - bu baribir talab qilinmaydi.

  • php fayl boshida bayt tartib belgilari. Bu shunday yoki yo'qligini bilish uchun PHP fayllaringizni hex muharriri bilan tekshiring. Ular 3F 3C baytlardan boshlanishi kerak. BOM EF BB BF ni fayllar boshidan xavfsiz olib tashlashingiz mumkin.
  • echo, printf, readfile, passthru ga qoʻngʻiroqlar, <? dan oldingi kod va boshqalar kabi aniq chiqish.
  • Agar display_errors php.ini xususiyati o‘rnatilgan bo‘lsa, php tomonidan chiqarilgan ogohlantirish. php dasturchi xatosi tufayli ishdan chiqish o'rniga, xatoni jimgina tuzatadi va ogohlantirish chiqaradi. Siz display_errors yoki error_reporting konfiguratsiyalarida muammoni hal qilish yaxshiroqdir.
    Umumiy sabablar qatorning aniqlanmagan elementlariga (masalan, $_POST['input'] empty yoki isset kiritilgan ma'lumotlar kiritilganligini tekshirish to'siq) yoki satr harfi o'rniga aniqlanmagan doimiydan foydalaning ($_POST[input] da bo'lgani kabi, etishmayotgan qo'shtirnoqlarga e'tibor bering).

chiqishni buferlash yoqilsa, muammo hal qilinadi; ob_start ga qo'ng'iroqdan keyingi barcha chiqishlar buferni bo'shatmaguningizcha xotirada buferlanadi, masalan. ob_end_flush bilan.

Biroq, chiqish buferi muammolardan qochadi, lekin nima uchun ilovangiz HTTP sarlavhasidan oldin HTTP korpusini chiqarishini aniqlab olishingiz kerak. Bu telefon qo'ng'irog'ini qabul qilib, qo'ng'iroq qiluvchiga noto'g'ri raqam borligini aytishdan oldin kuningiz va ob-havo haqida gaplashishga o'xshaydi.

person phihag    schedule 06.11.2011

Quyidagi qator o'rniga

//header("Location:".ADMIN_URL."/index.php");

yozish

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

or

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Bu, albatta, muammoingizni hal qiladi. Men bir xil muammoga duch keldim, lekin yuqoridagi tarzda sarlavha joylashuvini yozish orqali hal qildim.

person Ipsita Rout    schedule 24.03.2013

Sen ... qil

printf ("Hi %s,</br />", $name);

ruxsat berilmagan cookie-fayllarni sozlashdan oldin. Sarlavhalardan oldin hech qanday natijani, hatto bo'sh qatorni ham yubora olmaysiz.

person Seth Carnegie    schedule 06.11.2011

UMUMIY MUAMMOLAR:

(nusxa olingan: manba)

====================

1) buyrug'idan oldin hech qanday chiqish (masalan, echo.. yoki HTML kodlari) bo'lmasligi kerak.

2) <?php oldidan va ?> tegdan keyingi oq boʻshliqni(yoki yangi qatorni) olib tashlang.

3) OLTIN QOIDA! - o'sha php faylida (shuningdek, agar sizda include ta boshqa fayl bo'lsa) UTF8 BOMsiz kodlanganligini tekshiring (va emas) faqat UTF-8). Bu ko'p hollarda muammodir (chunki UTF8 kodlangan fayl php faylining boshida biror maxsus belgiga ega, uni matn muharriri ko'rsatmaydi)!!!!!!!!!!!!

4) header(...); dan keyin exit; dan foydalanishingiz kerak

5) har doim 301 yoki 302 havolasidan foydalaning:

header("location: http://example.com",  true,  301 );  exit;

6) Xato haqida xabar berishni yoqing va xatoni toping. Xatongiz ishlamayotgan funksiyadan kelib chiqqan bo‘lishi mumkin. Xatolar haqida xabar berishni yoqsangiz, har doim birinchi navbatda eng yuqori xatoni tuzatishingiz kerak. Masalan, "Ogohlantirish: date_default_timezone_get(): Tizimning vaqt mintaqasi sozlamalariga tayanish xavfsiz emas." - keyin pastroqda siz "sarlavhalar yuborilmagan" xatosini ko'rishingiz mumkin. Eng yuqori (1-chi) xatolikni tuzatgandan so'ng, sahifangizni qayta yuklang. Agar sizda hali ham xatolar bo'lsa, eng yuqori xatoni yana tuzating.

7) Agar yuqoridagilardan hech biri yordam bermasa, JAVSCRIPT qayta yoʻnaltirishdan foydalaning (ammo, tavsiya etilmaydigan usul), maxsus holatlarda oxirgi imkoniyat boʻlishi mumkin...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
person Community    schedule 09.04.2015
comment
301 yoki 302 ni aniq belgilash nima uchun muhim? - person Jānis Elmeris; 15.04.2019
comment
Agar php.ini faylida output_buffering o'rnatilgan bo'lsa, siz chiqishingiz mumkin. Mening uyimdagi Debian tizimidagi meniki 4096 ga o'rnatilgan. Men foydalanayotgan serverda hech qanday sozlama yo'qligini bildiradi. - person Programming Padawan; 09.07.2020

Bu qator tufayli:

printf ("Hi %s,</br />", $name);

Sarlavhalarni jo'natishdan oldin hech narsachop qilmaslik/echosiz.

person Sarfraz    schedule 06.11.2011

Oddiy maslahat: skriptingizdagi birinchi <?php tegidan oldingi oddiy bo'sh joy (yoki ko'rinmas maxsus belgi) bunga sabab bo'lishi mumkin! Ayniqsa, siz jamoada ishlayotganingizda va kimdir "zaif" IDE-dan foydalanayotgan bo'lsa yoki g'alati matn muharrirlari bilan fayllar bilan aralashib ketgan bo'lsa.

Men bu narsalarni ko'rdim;)

person Sliq    schedule 16.05.2012

Yana bir yomon amaliyot bu muammoni keltirib chiqarishi mumkin, bu hali aytilmagan.

Ushbu kod parchasini ko'ring:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Hammasi joyida, to'g'rimi?

Agar "a_important_file.php" bu bo'lsa nima bo'ladi:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Bu ishlamaydimi? Nega? Chunki allaqachon yangi qator yaratilgan.

Endi, bu odatiy stsenariy bo'lmasa-da, agar siz boshqaruvchiga narsalarni topshirishdan oldin juda ko'p fayllarni yuklaydigan MVC ramkasidan foydalansangiz nima bo'ladi? Bu odatiy stsenariy emas. Bunga tayyor bo'ling.

PSR-2 2.2 dan:


  • Barcha PHP fayllari Unix LF (linefeed) line ending dan foydalanishi KERAK.
  • Barcha PHP fayllari single blank line bilan tugashi KERAK.
  • Yopish ?> tegi only php boʻlgan fayllardan omitted boʻlishi KERAK

Ishoning, ushbu standartlarga rioya qilish sizni hayotingizdan ko'p soatlab qutqarishi mumkin :)

person MD. Sahib Bin Mahboob    schedule 08.11.2013
comment
Bir nechta standartlarga ko'ra (masalan, Zend), siz ?> yorlig'ini hech qanday faylga qo'ymasligingiz kerak. - person Daniel W.; 04.04.2014
comment
Men buni Windows muhitida takrorlay olmayman, chunki u har qanday kombinatsiya yordamida ishlaydi (yopish teglari, bo'sh joylar qo'shish, Enter tugmasini bosish va h.k.). Ko'rinishidan, bu muammo asosan Linux muhitida sodir bo'ladi. - person Junior Mayhé; 10.06.2015
comment
@JuniorM Bu takrorlanishi kerak. Siz tajriba o'tkazgan kodni yoki shunga o'xshash narsalarni baham ko'rishingiz mumkinmi? - person MD. Sahib Bin Mahboob; 11.06.2015
comment
Men Windows 7 da, so'nggi Wamp o'rnatilgan. Menimcha, bu xato chiziq oxiri uchun yashirin belgilar bilan bog'liq. Mening Wordpress'im shortcodes.php muammoga sabab bo'ldi. Men ushbu faylga oddiy funktsiyani qo'shdim va u ushbu sarlavhalar yuborilgan xatolikni ishga tushira boshladi. Men shortcodes.php-ni wordpress bilan solishtirdim va CR LF (odatiy Windows qatorining oxiri)dan tashqari hammasi yaxshi edi. Men buni Wordpress repo-dan CR LF o'rniga LF (Linux qator oxiri) bo'lgan asl faylni yuklab olish orqali hal qildim va funktsiyamni ham functions.php mavzusiga o'tkazdim. Asoslangan: bit.ly/1Gh6mzN - person Junior Mayhé; 11.06.2015
comment
@Sahib, e'tibor bering, men hali ham bu javobda aytilgan narsalarni takrorlay olmayman. Javob Linux muhiti uchun juda yaxshi. Men ?> <?php oralig'ida bo'sh bo'lgan narsalarni sinab ko'rdim, bitta bo'sh qatorni olib tashlash va qo'shish, ?> yopish tegini qo'shish va o'tkazib yuborish. Windows+ Wamp da bu kombinatsiyalarning barchasi yaxshi ishlaydi. Wierd... - person Junior Mayhé; 11.06.2015
comment
:+1: Menda ham xuddi shunday muammo bor edi, lekin aksincha: Men kiritgan muhim faylda header() buyrug'i bor edi va asosiy skript (juda o'xshash nomga ega) kiritilgandan oldin chiqdi. - person rubo77; 26.03.2021

Ba'zida ishlab chiqarish jarayonida WIN ish stantsiyalari va LINUX tizimlari (xosting) mavjud bo'lsa va kodda tegishli qatordan oldin hech qanday chiqish ko'rinmasa, bu faylning formatlanishi va Unix LF (linefeed) yo'qligi bo'lishi mumkin. ) qator oxiri.

Buni tezda tuzatish uchun biz odatda nima qilamiz, bu fayl nomini o'zgartirish va LINUX tizimida o'zgartirilgan fayl o'rniga yangi fayl yaratish va keyin tarkibni unga nusxalashdir. Ko'pincha bu muammoni hal qiladi, chunki WIN-da yaratilgan ba'zi fayllar hostingga ko'chirilganda bu muammoga sabab bo'ladi.

Bu tuzatish biz FTP tomonidan boshqariladigan saytlar uchun oson tuzatish bo'lib, ba'zida yangi jamoa a'zolarimizni biroz vaqt tejashga yordam beradi.

person Community    schedule 21.05.2015

Odatda bu xato aks sado yoki chop etishdan keyin sarlavhani yuborganimizda paydo bo'ladi. Agar bu xato ma'lum bir sahifada paydo bo'lsa, start_session() ga qo'ng'iroq qilishdan oldin sahifa hech qanday aks-sado bermasligiga ishonch hosil qiling.

Kutilmagan xatoga misol:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Yana bir misol:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Xulosa: session_start() yoki header() funktsiyalariga qo'ng'iroq qilishdan oldin hech qanday belgi chiqarmang, hatto bo'sh joy yoki yangi qator ham.

person Community    schedule 03.02.2015

person    schedule
comment
ob_start() faqat muammoni yashiradi; ushbu muammoni hal qilish uchun foydalanmang. - person Ja͢ck; 15.05.2013
comment
@Ja͢ck Agar ob_start() dan foydalanmasam, bu muammoni hal qilish uchun nima qilishim kerak: Headers already sent - person Shafizadeh; 14.07.2015
comment
@Sajad, agar siz foydalanayotgan muharrir tufayli xatoga yo'l qo'ysangiz, muammoni keltirib chiqarishni to'xtatish uchun sozlamalar bilan shug'ullanishingiz yoki muharrirlarni almashtirishingiz kerak. Agar siz boshqa sabablarga ko'ra xatoga yo'l qo'ysangiz, muammoning aslida nima ekanligini va uni hal qilish uchun ushbu savoldagi javoblarni (ayniqsa, qabul qilingan javob) o'qib chiqishingiz kerak. - person Samsquanch; 14.07.2015
comment
ob_start() muammoni yashirish emas, balki muammoni hal qiladi. - person Tomas; 22.10.2015
comment
Fayllarimni serverga yuklaganimda shunday muammoga duch keldim, bu hatto PHP5.3 ni PHP 5.6 yoki undan yuqori versiyali serverdan foydalanishni ham qoʻllab-quvvatladi. - person GGSoft; 09.12.2015
comment
@jack rost, men siz bilan roziman. Ideal usul php tegini boshlashdan oldin bo'sh joylarni olib tashlashdir <? - person Manish Shrivastava; 06.05.2017
comment
Ko'pchilik ob_start(); ni qaerga qo'shishni so'raydi. chunki ob_start(); ni qo'shgandan keyin ular hali ham xatoga yo'l qo'yishadi. Joriy sahifani ishga tushirgan sahifaga qo'shishingiz kerak. Masalan: 1-sahifa (tugma bosilgan) -› sahifa2.(sarlavhani yoʻnaltirish) -› sahifa0 (uy). Uni 1-sahifaga qo'shishingiz kerak. Ko'p odamlar chalkashib ketishdi va 2-sahifaga qo'shishdi. - person Dexter; 07.08.2018
comment
Muammoimni hal qildim. - person NickDimou; 26.01.2021