header - PHP

Lær at sende header informationer i PHP med header() funktionen

Introduktion

header() bruges til at sende en rå HTTP header.

Headeren er den information som sendes om filen før selve filen.

header() skal bruges før alt output.

Det vil sige før <!DOCTYPE html> hvis det er en HTML fil.

Eksempler

Eksempler med charset

Ved at tilføje charset kan man fortælle hvad encoding filen er skrevet i.
Det kan være nødvendigt for at tegn som æøå vises korrekt.
Uden angivelse af korrekte encoding vil tegn som æøå måske vises korrekt i nogle browsere og forkert i andre browsere.

Location

Med Location kan man viderestille til en anden side/fil.
Hvis man gør det anbefales det at bruge exit; efter for at undgå eventuel output senere i koden.

Content-Disposition filename

Med denne kode kan man bestemme hvad filnavnet skal hedde når brugeren downloader filen selvom den originale fil hedder noget andet.

Åbn/Gem dialogboks

Hvis du vil have at brugeren får en åbn/gem dialog boks i stedet for at filen vises i browseren kan du bruge følgende kode.

Her er noget kode jeg har brugt for at gøre så en fil blev downloadet i stedet for at den måske ville blive åbne i brugerens browser.
Desværre kan det give "PHP Fatal error" fejl hvis der skal downloades store filer og serveren ikke giver tid nok til det da PHP køre hele tiden mens der downloades.

readfile funktionen

Download med readfile() kan fejle hvis serveren ikke tillader nok tid.
Det sket på mit webhotel (hos one.com) hvis brugerne forsøger at downloade store filer.

En løsning på dette problem kan være at bruge .htaccess filer til at opsætte Apache HTTP serveren.

.htaccess

Hvis man ønsker at alle filerne i en mappe skal give en åbn/gem når brugeren forsøger at downloade dem i stedet for at filerne åbnes i browseren så kan man oprette en .htaccess i den mappe hvor man har sine filer og tilføje følgende i den.

.htaccess med symlink

Hvis man både ønsker at give brugeren mulighed for at åbne filen i browseren OG for åbn/gem dialogboks OG undgå problemet med readfile() timeout så kan man gøre sådan her...

Hav 2 forskellige adresser til samme fil.

Med PHPs symlink('/', '/download/dialog/hent') funktion oprettes et symbolic link (download/dialog/hent).
Det symbolske link er en fil som peger på download mappen.
Læg mærke til at det symbolske link er en fil og derfor ikke ender med /.

Så laver vi filen /download/dialog/.htaccess og skriver følgende i den.


Når brugeren besøger http://example.com/download/filnavn.pdf åbnes filen i browseren (afhænger af browser indstillingerne).
Når brugeren besøger http://example.com/download/dialog/hent/download/filnavn.pdf kommer en åbn/gem dialogboks.

Headers already sent

Hvis du får fejlbeskeden headers already sent er det fordi der er sendt output før header().

Med stort og småt

Efter hvad jeg kan forstå skrives et "felt" i headeren typisk med camel-case "Content-Type" (stort C og T) men det skulle være ligegyldigt hvad case man skriver med.

Skriv din kommentar

Spørg mig om hvad som helst
Du kan også skrive direkte til mig på
Stem
Søg
Language

Select English to navigate the website in English. Things like the navigation menu and contact form will be in English, but the main content on each page will not be translated.