Çirkin bilgi başlıkları. Http başlıkları nedir (Http başlıkları)

Çirkin bilgi başlıkları. Http başlıkları nedir (Http başlıkları)

Bu yazıda, "Başlıklar zaten gönderildiği için değiştirilemez" hatasının ana nedenlerine ve çözümlerine bakacağız. ("Başlık bilgisi değiştirilemiyor - zaten başlıklar tarafından gönderilen").

Bu hata ne anlama geliyor?

Hatanın nedenlerini anlamak için önce bu "başlıkların" ne olduğunu anlamalısınız.

Teoriye girmeyelim. Diyelim ki, herhangi bir kullanıcı bir web sayfasını açmadan önce, kendisine kodlama, site dili, sunucu verileri ve diğer hizmet bilgilerini içeren aynı "başlıklar" gönderiliyor. Çerezlerin ve oturumun da başlıklarda gönderildiğini ayrıca eklemekte fayda var.

Hangi komutlar bu hataya neden olur?

Hata "Başlık bilgisi değiştirilemiyor - başlıklar zaten tarafından gönderildi" header , setcookie gibi PHP komutlarını ve çerezlerin veya oturumların çalışmasıyla ilgili diğerlerini çağırabilir.

Hatanın nedenleri ve çözümleri.

En yaygın hata deneyimsizlikten kaynaklanmaktadır. Başlıkların, sayfa yüklenmeye başlamadan önce gönderildiğini zaten anladık.

Ancak programcılar, özellikle yeni başlayanlar, bunu unuturlar veya bilmezler bile. Ve önce sayfada bir şey görüntülemeye çalışırlar - çoğunlukla yankı komutunun yardımıyla ve ardından çerezler ayarlar, başlıklar gönderir vb. Bu da bu hataya yol açar.

İşte böyle bir hataya neden olacak bir kod örneği:

Ve işte doğru seçenek:

Yani, öncelikle başlıkları göndermeden hiçbir şey görüntüleyemezsiniz!

Her zaman açık değildir, ancak küçük bir farkla bir hata vardır. Bu, php belgenizin boşluklarla veya boş satırlarla başladığı zamandır, bu da bu satırların tarayıcıda görüntülendiği anlamına gelir.

Bunu takip etmek çok zor olabilir, çünkü örneğin bir Windows not defteri, bizi hiçbir şekilde uyarmadan ve hatta bu sembolü göstermeden önce bir Bayt Sırası İşareti ekleyebilir. Bu durumda, belgeyi diğer düzenleyicilerle açıp kontrol etmeye değer.

Yanlış başlıklara bir örnek:

Yani, ikincisi, daha önce

İnclude komutunu kullanırsanız özellikle dikkatli olmalısınız, aslında tüm dosyaları birleştirir ve tek bir sonuç verir ve önce site başlığını (slider, menü vb.) dahil edip ardından ana dosyaya başlıkları göndermeye çalışırsanız, o zaman tabii ki bu hatayı alacaksınız.

İşte bu tür yanlış kodlara bir örnek:

05/04/2017 Perş - 12:55 tarihinde eklendi

Belirli bir sorunun açıklaması

Düğmeye tıkladıktan sonra bir hata görüntülenir:

Uyarı: Başlık bilgileri değiştirilemez - C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php on line 12'de (çıktı C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php:10'da başlatıldı) tarafından zaten gönderilen başlıklar

Kod, bu konudaki koda benzer:

Deneysel Web

İndirmek için bir komut dosyası seçin

Komut dosyası işleyicisi:

Ne zaman oldu

Hata (uyarı) türü:

Uyarı: Başlık bilgileri değiştirilemez - başlıklar zaten tarafından gönderildi

Tarayıcı başlıklarının ayarlanmasını gerektiren bir şeyi zaten yaptıysanız ve şimdi bunların üzerine yenilerini yazmak istiyorsanız oluşur. Örneğin, metni zaten görüntülediyseniz, php başlıkları gösterir (özellikle, konum-- bu, istemci tarayıcıya (yanıtında) nasıl davranılacağını göstermek için istenen sayfada kalıp kalmayacağınızı veya başka bir sayfaya gitmeniz ve zaten orada olan isteğe bir yanıt almanız gerekip gerekmediğini gösterir.

sorunun kökü

Büyük olasılıkla, sizin durumunuzdaki sorun, zaten içerik (dosyada komut dosyasıyla karıştırılmış html etiketleri) veriyor olmanızdır. önce komutlar:

yankı başlığı($yönlendirme);

Header() işlevinin yalnızca istemci şu durumlarda çağrılabileceğini unutmayın: henüz veri gönderilmedi. Yani çıktıda ilk sırada gelmeli, çağrılmadan önce herhangi bir HTML etiketi, boş satır vb. Çoğu zaman kodu okurken bir hata oluşur. dosya işlevleri içerme veya gerektirme gibi, bu kodda header() çağrısından önce yazdırılan boşluklar veya boş satırlar vardır. Tek bir PHP/HTML dosyası kullanılırken aynı sorunlar ortaya çıkabilir.

Yani, komut dosyası işleyicisini html'den kaydetmek gerekir - sonuçta, aslında kendisi hiçbir şey çıkarmaz, ancak onu başka bir adrese aktarır - bu ilk.

başlık($yönlendirme);

yankı başlığı($yönlendirme);

Deney

echo() aslında yazdığı için http yanıt gövdesi, ve üstbilgilerde değil ve üstbilgi, yukarıda belirtildiği gibi, void döndürür (yani, değerler döndürmez), o zaman echo() kullanmanın bir anlamı yoktur, ancak
Ancak, bir deney yapmayı öneriyorum:

  1. html'yi kaldır
  2. yankıyı kaldırma

Header() aslında echo()'dan önce çağrıldığından (header(), echo() için bir argüman olduğundan) ve bu nedenle geri dönün -- aynı zamanda işlevin null döndürüp döndürmediğini kontrol edin -- bunun şu şekilde yorumlanıp yorumlanmayacağını kontrol edin boş satır veya (veya daha doğrusu) yankı, bir yönlendirme zaten gerçekleşeceğinden çalışmaya bile başlamaz.

nedenini tekrar gözden geçirelim

Onlar. header() çağrılmadan önce hiçbir içerik görüntülenmemelidir(Fonksiyonun açıklamasında ne yazıyor: http://php.net/manual/ru/function.header...)

  • 1) yankı olmadan
  • 2) html-metninin tarayıcıya olağan dökümünün yardımıyla değil.

Bizim durumumuzda, görünüşe göre, yankı hiçbir şeyi etkilemiyor, ancak işleyicideki html gerçekten etkiliyor.

sorun çözüldü

Tavsiyeniz üzerine kaldırıldı. HTML etiketleri. Artık yönlendirme doğru bir şekilde gerçekleşiyor, işleyici betiği şuna benziyor:

Yankı işlevi işi gerçekten etkilemez, yani. S. Holzner gibi bırakabilirsiniz:

Ayrıca, yönlendirme için kod tasarlarken, geçişin yapıldığı dosyanın uzantısına dikkat etmelisiniz: önerilen sözdizimiyle, başlık bağımsız değişkeninde belirtilmelidir.

  • Yorum yazmak için giriş yapın

Ama çalışmasını sağlayabilirsin

Ancak önceki işleyiciyi de çalıştırabilirsiniz.

Kullanıcı yönlendirmesi

seçeneği php.ini dosyasında ayarlarsanız

Çıktı_arabelleğe alma = 4096

  • Yorum yazmak için giriş yapın

Başlıkları yeniden göndermek yasaktır, HTTP protokolü böyle çalışmaz! Ama sonra ne yapmalı? Sayfadaki çıktıdan sonra oturumu başlatmanız ve tanımlama bilgisini de koymanız gerekiyorsa? - Çıktı tamponlamayı unutmayın.

Yani, sıfır olmayan bir arabellek boyutu ayarlandığında, dolana kadar başlıkları değiştirmek hala mümkündür. Sıfır arabellek boyutuyla, içeriğin çıkışından sonra hemen geri dönüşü önceden HTTP yanıt başlıklarını istemciye iletmek.

Ve zaten ağ üzerinden müşteriye "uçup giden" başlıkları değiştirmek istediğimiz ortaya çıktı (bu, onları düzeltmenin artık mümkün olmadığı anlamına gelir - özellikle başlık konum, istenen sayfada kalıp kalmayacağınızı veya başka bir sayfa talep edip etmeyeceğinizi belirtir - "yönlendirici" komut dosyasının yanıtı (bizim durumumuzda, bu bir form işleyicisidir) sadece başka bir sayfa talep etmemiz gerektiğini söyler), bu da php'nin bizi uyardığı .

Ancak: Elbette sorunu bu şekilde çözmek imkansız (çok doğru değil, daha doğrusu).

_____________
matfak vgu ve diğer klasikler =)

  • Yorum yazmak için giriş yapın

Küçük bir hatanın WordPress sitenizi tamamen çökertmesi inanılmaz. Elbette, iyi bilinen WordPress hata uyarısından bahsediyoruz. Uyarı: başlık bilgileri değiştirilemez - başlıklar zaten pluggable.php tarafından gönderilmiştir. Bu hatayla karşılaşanlardan biriyseniz, o zaman doğru yere geldiniz. Bunda, öncelikle bu hatanın ortaya çıkma nedenini tartışacağız ve sonunda sorunu çözecek çözümlere bakacağız.

Ne gerekli olacak

Başlamadan önce, aşağıdakilere sahip olduğunuzdan emin olun:

  • Barındırma kontrol panelinize erişim veya FTP erişimi

Başlık bilgileri değiştirilemiyor - zaten yanlışlıkla gönderilen başlıklar nasıl oluşuyor?

Sebeplerini daha iyi anlamak için bu hatanın bir örneğine bakalım. Hata genellikle şu biçimde görünür:

Uyarı: Başlık bilgileri değiştirilemez - satır #'da /public_html/wp-includes/pluggable.php'de (çıktı /public_html/wp-content/plugins/my-plugin/my-function.php:# adresinde başlatıldı) tarafından zaten gönderilen başlıklar

Gördüğünüz gibi, hata iki dosyadan bahsediyor. İlk dosya (bizim durumumuzda: my-function.php içinde barındırılan /public_html//wp-content/plugins/my-plugin/) zanlıların başında. Bu, WordPress tarafından sağlanan temel işlevselliği değiştirmeyi amaçlayan özel kodumuzdur. Çekirdek işlevselliği dosyadadır takılabilir.php(WordPress çekirdek dosyası, herhangi bir WordPress kurulumları). Başka bir deyişle, sorun birinci dosyadadır ve bu da ikinci dosyanın düzgün çalışmasını engeller.

Hatanın ana nedeni ekstra ilk dosyadaki boşluklar. Bunlar, dosyanın üstündeki veya altındaki boşluklar, dosyanın herhangi bir yerindeki gereksiz boşluklar ve hatta PHP etiketlerindeki boşluklardır. . Bu arada, programcıların kodlarına yanlışlıkla fazladan boşluk ekleyebilmeleri (ve genellikle yapmaları) nedeniyle, bu hata beklediğinizden daha sık meydana gelir. Hata mesajında ​​listelenen # satırı, sorunun yerini belirtir - bu, sorunu daha hızlı ve sorunsuz bir şekilde çözmenize yardımcı olur.

Düzeltme, başlık bilgisini değiştiremez - başlıklar zaten tarafından gönderildi

Artık hataya neyin neden olduğunu bildiğinize göre, onu düzeltmeye geçebilirsiniz. Bireysel olarak yardımcı olmadıysa, sorunu çözmek için tek tek veya sırayla deneyebileceğiniz iki seçenek göstereceğiz.

Seçenek 1 - Hatalı dosyayı düzenleme

Hatanın ilk çözümü Uyarı: başlık bilgileri değiştirilemez– hatalı bir dosyanın manuel olarak düzeltilmesi. Sorunu bulmak için ihtiyaç duyduğunuz bilgilere zaten hata mesajının kendisinde sahipsiniz (unutmayın, bu mesajdaki ilk dosyadır). Gereken tek şey, bu dosyayı FileZilla gibi bir istemci kullanarak veya bir dosya yöneticisi aracılığıyla FTP aracılığıyla açmaktır.

Temel olarak, burada dikkat etmeniz gereken tek şey, dosyadaki fazla boşlukları/boş satırları kaldırmaktır. İyi bir yer başlamak için hata mesajında ​​belirtilen satır # olacaktır. Bu noktadan itibaren, belgenin sonuna kadar diğer gereksiz boşlukları veya boş satırları arayarak dosyanın geri kalanını ayrıştırmaya devam edebilirsiniz.

PHP başlangıç ​​ve bitiş etiketlerini doğru yazdığınızdan emin olun. Etiketten önce veya sonra boşluk olmamalıdır , etiketle aynı ?> . Ayrıca, son kod satırı boşluk veya fazladan yeni satır ile bitmemelidir.

Aşağıdaki ekran görüntüsünde dosyayı görebilirsiniz wp-config.php, ilk PHP etiketinden önce boşlukları olan.


İPUCU: birçok metin editörleri gereksiz boşlukları otomatik olarak kaldırabilirsiniz. Örneğin, kaldırmak için ekstra boşluklar Atom düzenleyicide tüm kodu seçin ve P'ye gidin paketler -> Boşluk -> Sondaki Boşluğu Kaldır.

Seçenek 2 - Hatalı dosyayı değiştirin

Tabii ki, bir dizi hatalı dosyayı düzenlemek zor olabilir. Dosyalar, sitenize yeni yüklediğiniz bir eklenti veya tema ile ilgili olabilir veya WordPress çekirdek dosyaları bile olabilir.

Hata gerçekten bir eklenti veya temadan kaynaklanıyorsa, yapılması gereken tek şey onu yeniden yüklemektir. Bu eylem çoğu durumda yardımcı olur. Öte yandan, hatanın nedeni WordPress çekirdek dosyasıysa, en iyi çözüm WordPress'in temiz bir kopyasını alıp kurulumunuzdaki hatanın olduğu dosyayı çalışan bir sürümdeki aynı dosyayla değiştirmektir. Bu, hatalı dosyanın onarılmasını sağlayacaktır. ilk durum, WordPress site kurulumunuzun geri kalanı güvenli ve sağlam kalacaktır. Şimdi sayfayı yeniden yükleyin ve hatanın düzeltildiğinden emin olun.

Sonuç olarak

Bir dosyaya bir kod parçacığı yapıştırmış, yeni bir eklenti/tema eklemiş veya kodu elle yazmış olsanız da, dosyada fazladan boşluk bırakma riski vardır. Bu görünüşte masum alanlar bir WordPress hatası olabilir Uyarı: başlık bilgileri değiştirilemez - başlıklar zaten tarafından gönderildi.

Bu kılavuzda, bu tür hataların nasıl düzeltileceğini ele aldık ve şimdi siteniz tekrar beklendiği gibi çalışıyor. Daha fazla WordPress kılavuzu burada bulunabilir.

Yazar

Elena'nın bir profesyoneli var. teknik Eğitim bölgede Bilişim Teknolojileri ve farklı platformlar ve sistemler için farklı dillerde programlama deneyimi. Drupal, Joomla, Magento ve tabii ki günümüzün en popüler içerik yönetim sistemi olan WordPress gibi çeşitli CMS ile çalışarak 10 yılı aşkın bir süredir web alanına adamıştır. İster bir WordPress incelemesi ister VPS sunucunuzu nasıl kuracağınız olsun, makaleleri her zaman teknik ve doğrudur.

Bu hata mesajı genellikle PHP ile başlayan programcılar tarafından görülür. Bu hatanın neden oluştuğunu anlamak, bir çözüm bulmanıza yardımcı olacaktır.

PHP, siz istemeden sizin için web sayfaları oluşturma işinin çoğunu yapar. Bir web sayfasının iki bölümü vardır: başlık ve gövde.

Bu yaygın PHP hatası, bir programcı başlıkların işlenmesinde veya oluşturulmasında hatalar yaptığında görülür. İşte bir örnek:

Uyarı: Başlık bilgileri değiştirilemez – başlıklar zaten 12. satırda /home/usr1/public_html/includes/theme-header.php içinde (çıktı /home/usr1/public_html/sent.php:42'de başladı) tarafından gönderildi.

Otomatik olarak oluşturulduğundan ve sayfa, sunucu ve çerez hakkında bilgiler içerdiğinden, genellikle başlık hakkında endişelenmenize gerek yoktur. Başlıktaki bilgiler önemlidir, ancak genellikle kullanıcı tarafından görülmez. İşte bazı örnekler:

Tarih: 10 Temmuz 2006 Pazartesi 18:51:59 GMT Sunucusu: Apache/2.2.0 (Unix) mod_ssl/2.2.0 OpenSSL/0.9.7g İçerik Kodlama: gzip İçerik Türü: text/html

Bazen programcılar bazı başlık değerlerini değiştirmek isterler. Örneğin, PHP XML çıktısı üretiyorsa, bunu belirtmek için İçerik Türü değiştirilmelidir. Diğer bir yaygın örnek, bu makalede açıklandığı gibi, kullanıcının tarayıcısını Konum başlık öğesini kullanarak başka bir web sayfasına yönlendirmektir.

Başlık, web sunucusundan gelen yanıtta önce gelmelidir ve gövdeden bir boş satırla ayrılır. Bu hatanın nedeni, web sayfasının gövdesinin bir kısmının, başlık değeri ayarlanmaya çalışılmadan önce kullanıcıya gönderilmiş olmasıdır. PHP sizin için pek çok şeyi kolaylaştırdığından, sorun her zamanki yerinde saklanıyor olabilir. Sorunu bulmak için bazı yönergeler şunlardır:

  1. Soruna neden olan header() talimatını bulun. Hata bu satırın üzerinde veya öncesinde olmalıdır.
  2. Bu başlık talimatından önce çıktıyı kullanıcıya yönlendirebilecek herhangi bir talimat olup olmadığına bakın. Bir veya daha fazla bulursanız, başlık ifadesini onlardan önce taşımak için kodu değiştirin. Karmaşık koşullu ifadeler sorunu karmaşıklaştırabilir, ancak sorunun çözülmesine de yardımcı olabilir. Alternatif olarak, PHP betiğinin en üstüne, başlık değerini olabildiğince erken belirleyen ve orada ayarlayan bir koşul uygulayabilirsiniz.
  3. Başlangıç ​​ve bitiş PHP etiketlerinin dışında boşluk olmadığından emin olun. Oysa başlangıç ​​etiketinden önce boş bir satır
  4. Dosyanızı UTF-8 kodlamasında kaydederseniz, dosyanın imzasız (BOM olmadan) kaydedildiğinden emin olun. İmza, dosyanın başına eklenen bir bayttır ve PHP betiği bu biçimde kaydedilirse, bu bayt, sayfa gövdesinin çıktısının bir parçası olarak algılanacaktır ve bu, sorundan kaçınmasına izin verilmemelidir. Düşünüyor musun.

Bu hata ile sürekli benimle iletişime geçip soruyorlar: " Hata nerede?". Bir yerden her zaman benzer mektuplar aldım. 500 , Az değil. Zaten "" hatasıyla bitirme zamanı. Bu yazıda bu hatanın nedenlerinden ve nasıl çözüleceğinden bahsedeceğim.

Bu hatayı Rusçaya çevirirseniz, şöyle bir şey elde edersiniz: " Zaten gönderildikleri için başlık değiştirilemiyor".Bu nedir." manşetler"? Hadi çözelim.

Sunucu, gövdeye ek olarak istemciye bir yanıt döndürdüğünde (örneğin, HTML Kodu sayfalar), ayrıca başlıklar da vardır. Sunucu yanıt kodunu içerirler, kurabiye, kodlama ve diğer birçok hizmet parametresi. Olabilmek PHP betiği başlık gönder? Tabii ki yapabilir. Bunun için bir işlev var başlık ().

Bu işlev, örneğin, ne zaman sürekli olarak kullanılır. Ayrıca, bu işlev ne zaman düzenli olarak kullanılır.

Ayrıca başlıklar gönderildiğinde değiştirilir. kurabiye ve oturumun başında (işlev session_start()).

Ve şimdi neden hata hala devam ediyor? Sunucu, sunucuya her zaman önce başlıkları, ardından gövdeyi verir. Sunucu zaten başlıkları döndürdüyse, gövde gider ve ardından bazılarıyla karşılaşır. session_start(). Talihsiz programcının gövde başlamadan önce başlıkları göndermeyi unuttuğu ve şimdi çoktan kalkmış olan trene yetişmek istediği ortaya çıktı.

İşte "" hatası olan kod:



?>

Tabii ki, böyle saçmalıklar PHP affetmez. Ve şöyle yazmak zorunda kaldım:

session_start(); // Ve oturumu başlatalım
?>

Bu komut dosyası artık herhangi bir hataya neden olmaz, çünkü önce tüm başlıklar gönderilir ve ancak o zaman sunucu yanıt gövdesi oluşturulur.

Hatalı başka bir kod örneği:

yankı "Merhaba!"; // bir çıktı alın
session_start(); // Ve oturumu başlatalım
?>

Aynı şey, nedense, önce gövde (veya bir parçası) görüntülenir ve ardından başlıkların da değiştirilmesi gerektiğini hatırladılar.

Nasıl doğru şekilde yeniden yazılır verilen kod kendin için düşün.

Başka bir örnek:




çıkış;
?>

Böyle bir kodun yazarı başarısız olduğunda, bu hataya şaşırır ve şöyle der: "Çok garip bir tesadüf, işlem başarılı olduğunda, her şey yolundadır, ancak bir tür hata olduğunda, bana Cannot change header information - başlıklar zaten gönderildi". Kelimenin tam anlamıyla değil, ama mesele bu.

Sorun aynı ve bunu yazmanın doğru yolu:

$hata = doğru; // Herhangi bir hata var mıydı?
if ($hata) echo "Bir hata oluştu";
else header("Konum: ".$_SERVER["HTTP_REFERER"]); // Geri yönlendirme yap
çıkış;
?>

Ayrıca ince hatalar da var:

header("Konum: ".$_SERVER["HTTP_REFERER"]); // Geri yönlendirme yap
çıkış;
?>

Bu koddaki hata boşluk nedeniyle oluşur., daha önce var olan . Boşluk normal bir karakterdir ve yanıt gövdesinin bir parçasıdır. Ve sunucu bunu gördüğünde, daha fazla başlık olmayacağı sonucuna varır ve gövdeyi gösterme zamanı gelir.

Hepsi aynı nitelikte olan aşağıdaki hatalar da vardır. Diyelim ki bir dosya var. a.html:

require_once "a.html";
header("Konum: ".$_SERVER["HTTP_REFERER"]); // Geri yönlendirme yap
çıkış;
?>

Ve kişi içtenlikle şaşırır, eğer hiçbir şey göstermediyse hata nereden geliyor? Yani özel olarak bakmanıza gerek yok. 1 dosya ve içindeki tüm dosyalar. Ve bağlı olanlara bağlı olanlarda, çıkış olmaması için de bakmanız gerekir.

Ve son an, ama daha zor. Bazen bu hatanın doğru kodla ortaya çıktığı ortaya çıktı. Sonra hepsi kodlama meselesi. Dosya kodlamasının " olduğundan emin olun. Malzeme Listesi olmadan UTF-8"ve aynen" malzeme listesi olmadan", sadece" değil UTF-8". Çünkü ürün ağacı dosyanın en başına giden baytlardır ve çıktıdırlar.

Ortaya çıkan tüm sorunları ele almaya çalıştığım için, bu makalenin "" hatasıyla ilgili tüm sorunları kesinlikle çözmeye yardımcı olacağını umuyorum. Ve sonra başınızı çevirip düşünmeniz gerekiyor, kodunuzda yanlış olan ne?