Override php headers

Tags:    php header

<< < 12 > >>
Hej
jeg er igang med at lave et større projekt, sådan blot for sjov, og skal nu have mulighed for at ændre de header information som php sætter, så jeg f.eks. kan sende en HTTP403 hvis man forsøger at tilgå en side der kræver administrator rettigheder.
Når jeg forsøger at gøre det i mit script eller funktion så for jeg følgende fejl:
Fold kodeboks ind/udKode 

Jeg har forsøgt at indsætte denne kode for at sende 403-error:
Fold kodeboks ind/udPHP kode 

Hvordan kan jeg styre header informationerne på siden når dele af siden allerede er indlæst, men endnu ikke er vist til brugeren.

EDIT: En midlertidig løsning er dette JavaScript:
Fold kodeboks ind/udJScript kode 




Indlæg senest redigeret d. 05.10.2013 21:12 af Bruger #17072
11 svar postet i denne tråd vises herunder
5 indlæg har modtaget i alt 45 karma
Sorter efter stemmer Sorter efter dato
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.


http://php.net/manual/en/function.header.php

Det er meget simpelt. Headers skal sendes før output. :)



Du skal sætte header('HTTP/1.1 403 Forbidden'); før du kalder users.func.php:112

du kan evt bruge en output buffer



Du bør altid gemme output til allersidst, helt generelt, så Mulighed 1 er den du bør arbejde henimod.

Men i en større løsning kan du risikere at skulle bygge det helt om, og det kan godt være, det ikke er plausibelt -- men så må du huske det til næste gang!

Som en midlertidig løsning kan du output buffe alting, så output ikke bliver sendt før til allersidst.

Det gør du ved at smide følgende ind allerførst i din kode, før ALT andet:
Fold kodeboks ind/udPHP kode 

Og smide dette ind som det allersidste i din kode/output
Fold kodeboks ind/udPHP kode 
.

Eksempel:
Fold kodeboks ind/udPHP kode 


Det, dette gerne skulle gøre, er at istedet for at skrive outputtet til responset, skriver den det til en midlertidig buffer i serverens memory, som så først bliver sendt til brugeren til sidst ved at blive flushet. På den måde er al PHP-kode, inklusiv headerkode, kørt inden output bliver sendt.

Men når du gør dette, skal du være 10000% sikker på, der ikke er noget som helst output før og efter output bufferen er slået til. Heller ikke blanke linier eller mellemrum.



Jeg tror du har misforstået hvad header-funktionen gør.

header() vil kun viderestille dig, hvis du bruger Location: headeren. Din htaccess 403 side vil kun reagere, hvis Apache selv laver en 403-fejl, fx hvis du prøver at åbne en mappe uden en index-fil (og du ikke har slået directory indexing til). Hvis du på en PHP-side rejser en 403 header, vil du stadig få den PHP-side, men den vil registrere sig som en forbidden-side i headeren. Det vil sige at systemer som fx google bots, ajax-kald osv. vil få 403 status på siden og reagere derefter. Brugeren vil stadig se den side, de er på.



Måden en redirect-header fungerer på er at den sender en HTTP/1.1 302 header med en tilhørende location. Det vil altså sige at du ikke kan sætte din egen 403 responskode i samme respons (du kan godt ændre responskoden fra 302 til andre redirect koder som fx 301 "moved permanently", men ikke til arbitrære responskoder).

Dit bedste bud vil nok være at istedet for at redirecte, sætte 403-headeren og derefter include 403.php. Hvis du gør dette inden anden output kan du dermed lade som om du har redirectet.

Fold kodeboks ind/udPHP kode 


I teorien kunne du også godt bare redirecte til 403.php og så statisk sætte 403-headeren deri, men isåfald vil du ikke rent faktisk få nytte af 403-responskoden. Bots, scripts etc. vil opfatte responskoden fra redirectet og enten ignorere den næste responskode eller pådutte den et seperat kald. På den måde jeg har beskrevet får du den korrekte header på den korrekte side. Så ved bots osv. nemlig at "din-side-de-ikke-har-adgang-til.php" er Forbidden.



Indlæg senest redigeret d. 09.10.2013 17:09 af Bruger #8223
Ok. Så jeg har ikke så mange muligheder.
Mulighed 1:
Lav min kode om så jeg kan kalde header('HTTP/1.1 403 Forbidden'); før jeg sender nogen form for output.
Mulighed 2:
Udskrive en fejlbesked på siden hvis brugeren ikke har adgang.
Mulighed 3:
Anvende ovenstående JavaScript til at sende brugeren hen til 403-siden.

Jeg takker for jeres input.



Det var selvfølgelig en mulighed. Kunne også gøre som Drupal hvor jeg gemmer alt i arrays og variabler og så til sidst smider jeg det hele lige i hovedet på brugeren. Så kan jeg nå at aflive resten af scriptet og sende den korrekte header inden der vises noget til brugeren.



Det er nu ikke bare noget Drupal gør, det er som jeg nævnte noget alle systemer med respekt for sig selv bør gøre. Output skal altid komme som det absolut sidste, et serverside script laver. Mit forslag var udelukkende som midlertidig løsning, hvis dit system er for stort til at det er plausibelt at skrive det om så output kommer til sidst. :)



Så er jeg gået igang med at lave lidt om således at jeg kan modificere min header information inden der sendes nogen form for output.
Min index.php ser således ud:
Fold kodeboks ind/udPHP kode 

Jeg kører nu en funktion kaldet initialize(); i min init.php som ser således ud:
Fold kodeboks ind/udPHP kode 

I min initialize funktion har jeg sat header('HTTP/1.1 403 Forbidden'); som det eneste kode og så forsøgt at indlæse side.
Er vi enige om at jeg nu sender header information før jeg sender output?
De øvrige funktioner er blot funktioner der henter information fra en SQL-database og gemmer i variabler og arrays.
Eftersom at jeg indlæser init.php før nogen af de andre filer, så er der ikke lavet noget output som er sendt til siden, men det er blot blevet gemt i variabler.

Dog sender den mig ikke videre til min 403-error side som er defineret i .htaccess.
Laver jeg derimod header('Location: somefile.php'); så sendes jeg til somefile.php.
Så det ser ud som om at der stadig er noget der går galt.



Havde nok på fornemmelsen at der var noget jeg havde misforstået.
Men hvordan får jeg den så til at sende 403 og så lave redirect to 403.php?
Måske:
Fold kodeboks ind/udPHP kode 




<< < 12 > >>
t