(PHP 4, PHP 5, PHP 7)
header — Ham bir HTTP başlığı gönderir
$dizge
[, bool $değiştir
= true
[, int $http_yanıt_kodu
]] )header() işlevi ham bir HTTP başlığı göndermek için kulanılır. HTTP başlıkları hakkında ayrıntılı bilgi edinmek için » HTTP/1.1 Belirtimi'ne bakınız.
header() işlevinin normal HTML etiketleri ve dosya veya PHP'deki boş satırlar dahil herhangi bir çıktıdan önce çağrılması gerektiğini unutmayınız. header() çağrısından önce sıkça yapılan hatalar: kodu include, require veya başka bir dosya okuma işlevi ile okumak; betik HTML'ye gömülüyse betiğin veya dosyanın başındaki boşluklar veya boş satırlar.
<html>
<?php
/* Bu bir hata verecektir. header() çağrısından
* önce hiçbir satırlar olmamalıydı. */
header('Location: http://localhost/');
?>
dizge
Başlık dizgesi.
İki özel çağrı biçimi vardır. İlki, HTTP durum kodu gönderilirken kullanılır ve başlık "HTTP/" dizgesi ile başlar (harf büyüklüğüne duyarsız). Örneğin Apache'yi eksik dosyalarla ilgili sorunlar için (ErrorDocument yönergesi ile) bir PHP betiğini kullanacak şekilde yapılandırmışsanız betiğinizde uygun bir durum kodu üretmek için bu biçimi kullanabilirsiniz.
<?php
header("HTTP/1.0 404 Not Found");
?>
İkinci özel biçim "Location:" başlığıdır. Bu başlığın tarayıcıya geri gönderilmesinden başka, bir 201 veya 3xx durum kodu henüz atanmamışsa ayrıca bir REDIRECT (302) durum kodu da gönderilir.
<?php
header("Location: http://mesela.dom/"); /* Tarayıcıyı yönlendir */
/* Yönlendirme sonrası herhangi bir kodun çalıştırılmamasını sağlayalım. */
exit;
?>
değiştir
değiştir
değiştirgesi isteğe bağlı olup, önceki
bir başlığın mı değiştireceğini yoksa aynı türde ikinci bir başlık
daha mı ekleneceğini belirtilir. Öntanımlı davranış mevcudu
değiştirmektir. İşleve ikinci değiştirge olarak FALSE
aktarırsanız
aynı türde çok sayıda başlık bulunması için işlevi zorlamış olursunuz.
Örnek:
<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>
http_yanıt_kodu
HTTP yanıt kodunun belirtilen değer olması için zorlanır.
Hiçbir değer dönmez.
Sürüm: | Açıklama |
---|---|
4.4.2 ve 5.1.2 | Başlık yerleştirme saldırılarına karşı bir önlem olarak bu işlev artık bir kerede birden fazla başlık gönderilmesine izin vermemektedir. |
4.3.0 |
http_yanıt_kodu değiştirgesi eklendi.
|
4.0.4 |
değiştir değiştirgesi eklendi.
|
Örnek 1 - İndirme söyleşisi
Kulanıcıyı, gönderdiğiniz veriyi (örneğin, bir PDF dosyası) kaydetmesi için uyarmak isterseniz, bir dosya ismi belirtmek ve tarayıcının bir dosya kayıt söyleşisi göstermesini sağlamak için » Content-Disposition başlığını kullanabilirsiniz.
<?php
// Bir PDF çıktılayacağız
header('Content-type: application/pdf');
// Dosya ismi indirilen.pdf olsun
header('Content-Disposition: attachment; filename="indirilen.pdf"');
// Okunacak PDF dosyası
readfile('original.pdf');
?>
Örnek 2 - Yönergelerin önbelleklenmesi
PHP betikleri çoğunlukla istemcinin tarayıcısı veya sunucuya aracılık eden vekiller tarafından önbelleğe alınmaması gereken devingen içerikler üretirler. Çoğu vekilin veya tarayıcının önbellekleme işlemini kapatmasını şöyle sağlayabilirsiniz:
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Geçmişte bir tarih
?>
Bilginize:
Yukarıdaki başlıkların hiçbirini çıktılamadığınız halde sayfalarınız önbelleğe alınmıyor olabilir. Kullanıcının kendi tarayıcısının önbellekleme ile ilgili öntanımlı davranışını değiştirebileceği çok çeşitli seçenekleri olabilir. Yukarıdaki başlıkları göndererek bu tür olası ayarları geçersiz kılabilirsiniz.
Ayrıca, oturumları kullanırken önbellekleme ile ilgili doğru başlıkların özdevinimli olarak üretilmesi için session_cache_limiter() işlevini ve session.cache_limiter yapılandırma yönergesini kullanabilirsiniz.
Bilginize:
PHP 4'ten itibaren, bu işlevi çağırmadan önce, tarayıcıya gönderilene kadar sunucuda bekletilmek üzere çıktıyı bir tampona yazabilirsiniz. Bu işlemi betiğinizden ob_start() ve ob_end_flush() işlevlerini çağırarak veya output_buffering yapılandırma yönergesini php.ini veya sunucu yapılandırma dosyalarında belirterek yapabilirsiniz.
Bilginize:
header() çağrısının ilk çağrı olup olmamasından bağımsız olarak istemciye ilk olarak daima HTTP durum başlığı satırı gönderilir. header() işlevini hiçbir HTTP başlığı gönderilmeden önce yeni bir durum satırı ile kullanırsanız bu durum satırını geçersiz kılabilirsiniz.
Bilginize:
Microsoft Internet Explorer 4.01'de bunun çalışmasını engelleyen bir hata vardır ve bundan kurtulmanın çaresi yoktur. Ayrıca, Microsoft Internet Explorer 5.5'te de böyle bir hata vardır. Fakat SP2'ye yükselterek bu sorundan kurtulmak mümkündür.
Bilginize: Eğer safe mode etkinse ve HTTP kimlik doğrulaması için WWW-Authenticate başlığını kullanıyorsanız başlığın realm alanına betiğin kullanıcı kimliği eklenecektir.
Bilginize:
HTTP/1.1, » Location: için değiştirge olarak bir mutlak URI belirtilmesini gerektirir (şema, konak ismi ve mutlak dosya yolu dahil), fakat bazı istemciler göreli URI'leri kabul ederler. Bir mutlak URI'yi bir göreli URI'ye dönüştürmek için örnekteki gibi $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] ve dirname() kullanabilirsiniz:
<?php
/* Bulunulan dizinde başka bir sayfaya yönlendirelim */
$konak = $_SERVER['HTTP_HOST'];
$yol = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$ek = 'sayfam.php';
header("Location: http://$konak$yol/$ek");
exit;
?>
Bilginize:
Oturum kimliği, session.use_trans_sid etkin olsa bile Location başlığı ile aktarılmaz.
SID
sabiti kullanılarak elle aktarılmalıdır.