header

(PHP 3, PHP 4 )

header -- Stuur een raw HTTP header

Beschrijving

int header ( string string [, bool replace [, int http_reponse_code]])

header() wordt gebruikt om raw HTTP headers te versturen. Zie de HTTP/1.1 specificatie voor meer informatie over HTTP headers.

De optionele replace parameter geeft aan of de header een vorige gelijkaardige header moet vervangen, of een tweede header van hetzelfde type toe moet voegen. Standaard zal hij vervangen, maar als je FALSE meegeeft als tweede argument kun je meerdere headeers van het zelfde type forceren. Bij voorbeeld:

<?php
header
('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM',FALSE);
?>

De tweede optionele http_response_code parameter forseert de HTTP reactie code naar de aangegeven waarden. (Deze parameter is aanwezig in PHP 4.3.0 en hoger.)

Er zijn twee speciale header calls. De eerste is een header die begint met de string "HTTP/" (case is onbelangrijk), die wordt gebruikt om uit te zoeken welke HTTP status moet worden verzonden. Bijvoorbeeld, als je Apache hebt geconfigureerd om een PHP script te gebruiken om requests voor ontbrekende bestanden af te handelen (door de ErrorDocument directive te gebruiken), wil je er misschien voor zorgen dat je script de goede status code genereert.

<?php
header
("HTTP/1.0 404 Not Found");
?>

Opmerking: De http status header is altijd de eerste die wordt verstuurd naar de client, of de actuele header() nu de eerste aanroep is of niet. De status header kan worden aangepast met het aanroepen van de header() met daarin een nieuwe status regel, mits de headers al niet zijn verstuurd naar de client.

Opmerking: In PHP 3 werkt dit alleen als PHP is gecompileerd als een Apache module. Je kunt echter hetzelfde effect verkrijgen door middel van het gebruiken van de Status header.

<?php
header
("Status: 404 Not Found");
?>

De tweede speciale case is de "Location:" header. Deze header wordt niet alleen teruggestuurd naar de browser, maar hij geeft ook een REDIRECT (302) status code aan de browser tenzij een 3xx status code al eerder werd ingesteld.

<?php
header
("Location: http://www.php.net/"); /* Stuur de browser naar de PHP website */
exit;                        /* Zorg dat de code hieronder niet wordt uitgevoerd */
?>

Opmerking: HTTP/1.1 heeft een absolute URI als argument voor Location:, inclusief het schema, de hostname en absoluut pad, maar sommige clients accepteren relatieve URIs. Je kunt normaal $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] en dirname() gebruiken om zelf een absolute URI te maken van een relatieve:

<?php
header("Location: http://".$_SERVER['HTTP_HOST']
                          .dirname($_SERVER['PHP_SELF'])
                          ."/".$relative_url);
?>

PHP scripts genereren vaak dynamische content die niet mag worden gecached door de client browser of een proxy cache tussen de server en de client browser. Je kunt veel proxies en clients kunnen forceren het cachen uit te zetten met

<?php
header
("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum in het verleden
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                                                     
// Altijd veranderd
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");                          // HTTP/1.0
?>

Opmerking: Het zou kunnen dat je pagina's zelfs niet worden gecached als je niet alle headers hierboven meestuurt. Er zijn een aantal opties die gebruikers zelf kunnen instellen voor hun browser die ervoor zorgen dat hun standaard caching gedrag verandert. Door de bovenstaande headers mee te sturen kun je alle instellingen die anders zorgen dat de output van je script wordt gecached overschrijven.

Bovendien kunnen de session_cache_limiter() en de session.cache_limiter configuratie worden gebruikt om automatisch de correcte caching-gerelateerde headers mee te sturen wanneer er sessies worden gebruikt.

Onthoud dat header() moet worden aangeroepen voor er output is verzonden, door normale HTML tags, lege regels in een file, of vanuit PHP. Het is een veel voorkomende fout om met include(), require(), functies, of een andere file toegang functie output te verzenden voordat header() wordt aangeroepen. Hetzelfde probleem bestaat wanneer er een enkele PHP/HTML file wordt gebruikt.

<html>
<?php
// Dit geeft een fout. Let op de output hierboven,
// die voor de header() call staat.
header ("Content-type: audio/x-pn-realaudio");
?>

Opmerking: In PHP 4 kun je output buffering gebruiken om dit probleem te voorkomen, waarbij het begin van al je output naar de browser wordt gebuffered op de server tot je het verzendt. Je kunt dit doen door ob_start() en ob_end_flush() aan te roepen in je script, of door de output_buffering instelling in je php.ini of je server configuratie files in te stellen.

Als je wil dat de gebruiker wordt gevraagd de data die je zendt op te slaan, zoals een gegenereerd PDF bestand, kun je de Content-Disposition header gebruiken om een standaard filenaam mee te geven en de browser te forceren de opslaan dialoog te laten zien.

<?php
// We gaan een PDF outputten
header("Content-type: application/pdf");
// De PDF die we gaan outputten heet downloaded.pdf
header("Content-Disposition: attachment; filename=downloaded.pdf");
// De PDF source is in original.pdf
readfile("original.pdf");
?>

Opmerking: Er is een bug in Microsoft Internet Explorer 4.01 die ervoor zorgt dat dit niet werkt. Er is niks aan te doen. Er is ook een bug in Microsoft Internet Explorer 5.5 dat hiermee problemen veroorzaakt. Deze kan worden opgelost door up te graden naar Service Pack 2 of later.

Opmerking: Als safe mode is geactiveerd dan zal het uid van het script worden teogevoegd aan het realm gedeelte van de WWW-Authenticate header als deze wordt geset met deze functie (wordt gebruikt voor HTTP autenticatie).

Zie ook: headers_sent(), setcookie(), en de sectie over HTTP authenticatie.