Headere
0
Headerele sunt elemente prin care browser-ul si serverul web comunica in fundal pentru a afisa o pagina web in bune conditii.
Exista 2 tipuri de headere: cele emise de browser (headere de request) si cele emise de server (headere de raspuns).
Request headers
De fiecare data cand un utilizator acceseaza o pagina web, browserul trimite catre server cantitati mici de date, sub forma request headers (sau, intr-o traducere destul de rar folosita la noi, antetelor de cerere). Aceste antete cuprind detalii despre pagina care a fost solicitata, modul de transfer a ei, precum si informatii despre capabilitatile browser-ului.
De exemplu, cand ati accesat aceasta pagina, browser-ul dvs a trimis catre server urmatoarele headere de request:
GET /http/ HTTP/1.1 Host: php.punctsivirgula.ro Connection: close User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ro; rv:1.9.1) Gecko/20090624 Firefox/3.5 Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 Cache-Control: no Accept-Language: de,en;q=0.7,en-us;q=0.3
Headerele sunt trimise de browser in mod implicit, utilizatorul nu trebuie sa faca ceva anume pentru asta. De asemenea, headerele nu pot fi (usor) modificate inainte de a fi trimise.
Response headers
In raspuns la request headers primite de la browsere, serverele web trimit inapoi 2 tipuri de informatie:
- headere de raspuns (response headers)
- continutul efectiv al paginii solicitate (continut ce poate fi construit/modificat prin intermediul PHP)
Headerele de raspuns contin informatii despre pagina solicitata (cum ar fi: daca exista sau nu, dimensiunea ei, tipul de continut, etc).
De exemplu, in urma solicitarii acestei pagini in browser, serverul nostru a trimis urmatorul raspuns:
HTTP/1.1 200 OK Date: Fri, 17 Jul 2009 14:54:18 GMT Server: Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.8b PHP/5.2.6 mod_scgi/1.12 X-Powered-By: PHP/5.2.6 Set-Cookie: PHPSESSID=h8144gj13180725c2aufkrd397; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Connection: close Transfer-Encoding: chunked Content-Type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Ghid PHP pentru incepatori - headere. cookies. modificarea requestului HTTP</title> .... </html>
Headerele reprezinta prima parte, separate de continut prin 2 linii goale (reprezentate prin caracterele \r\n\r\n). Din acest raspuns, browserul "stie" sa interpreteze headerele si sa afiseze in pagina doar continutul, astfel ca antetele nu vor fi niciodata vizibile utilizatorului final.
La fel ca in cazul antetelor de cerere, cele de raspuns sunt trimise in mod automat de catre server, inainte de a trimite continutul si nu este nevoie ca programatorul sa intervina. Exista insa situatii cand trebuie ca anumite antete sa fie modificate. Acest lucru este posibil cu ajutorul limbajului PHP.
PHP ofera posibilitatea modificarii headerelor de raspuns prin intermediul functiei header.
# trimiterea unui semnal (Not-Found, Status OK, etc) header( 'HTTP/1.0 404 Not Found' ); // spune browserului sa afiseze un mesaj de eroare header( 'HTTP/1.0 200 OK' ); // anunta ca pagina exista si va fi trimisa catre browser # redirectionare - "spune" browserului sa "mearga" la alta adresa header( 'Location: http://www.punctsivirgula.ro/' ); # specificarea tipului paginii ce se va afisa - in urma acestor apeluri, browser-ul va # astepta alte tipuri de continut decat pagini HTML header( 'Content-type: application/pdf' ); // browserul va astepta sa fie trimis un PDF header( 'Content-type: text/css' ); // fisier css
Aplicatie: Sa se redirectioneze un utilizator la o anumita pagina
0
<?php # daca este definit un site, fac redirectarea if( isset( $_GET[ 'site' ] ) ) { # folosesc instructiunea de selectie multiple switch( $_GET[ 'site' ] ) { case 'home': header( 'Location: /'); break; # break este necesar dupa fiecare 'ramura' a lui switch case 'search': header( 'Location: http://www.google.ro' ); break; default: # daca nici una din conditiile de mai sus nu a fost indeplinita header( 'Location: http://www.punctsivirgula.ro' ); } exit; # dupa header() trebuie oprita executia scriptului } ?> <a href="page.php?site=home">home</a> <a href="page.php?site=search">home</a> <a href="page.php?site=bla">other</a>
Important! Inainte de folosirea instructiunii header() nu trebuie sa fie afisat nimic (cu print, echo, sau scriind cod HTML). Se intampla adesea ca si un spatiu ramas la sfarsitul unui fisier inclus cu include sau require sa opreasca functia de la a functiona corect. De exemplu, urmatoarele secvente de cod nu sunt valide:
<?php print "Nu mai pot trimite headere"; header( "Location: http://www.google.ro" ); exit; ?>
<html> <body> <?php header( "Location: /" ); exit; ?>
Aplicatie: Sa se creeze o pagina care ofera spre download un document PDF, in loc sa-l deschida in browser
1
Probabil ca multi dintre voi ati observat ca browserele afiseaza documentele PDF sau imaginile direct in cadrul ferestrei, iar pentru a le descarca trebuie ales in mod explicit optiunea de Save din meniul browserului. Acest comportament poate fi schimbat prin headere. Daca serverul web i-ar "spune" browserului ca ceea ce se va transmite trebuie downloadat si nu afisat atunci problema ar fi rezolvata. Sa creem asadar fisierul download.php
<?php # pagina download.php va primi ca parametru numele fisierului # forma unui link va fi urmatoarea: download.php?file=document.pdf if( isset( $_GET[ 'file' ] ) ) { # curat calea fisierului pentru a elimina riscurile de atacuri $_GET[ 'file' ] = preg_replace( '/\.\.\//', '', $_GET[ 'file' ] ); # daca a fost trimis un fisier verific daca exista if( !is_file( $_GET[ 'file' ] ) ) { # daca fisierul nu exista, trimit un semnal corespunzator header( "HTTP/1.0 404 Not Found" ); # timit un mesaj de eroare print "<html><title>Document inexistent</head> <body><h1>Documentul nu a fost gasit.</h1>Parametrul <tt>file</tt> trebuie sa specifice un fisier existent in folderul curent. Incercati din nou.</body></html>"; exit; # opresc executia aici } # daca s-a ajuns aici, inseamna ca fisierul exista # preiau extensia pentru a-i determina tipul $type = strrchr($_GET[ 'file' ], '.' ); # preiau textul de la ultimul punct la final # $type va fi acum ceva de genul ".pdf" if( strlen( $type ) ) $type = substr( $type, 1 ); # elimin punctul # in functie de tip, trimit browserului un anumit Content-Type # este necesar pentru ca browserul sa stie ce tip de fisier va fi descarcat switch( $type ) { case 'pdf': header( 'Content-type: application/pdf' ); // fisierul va fi PDF break; # break este necesar dupa fiecare 'ramura' a lui switch case 'gif': header( 'Content-type: image/gif' ); break; case 'jpg': # daca nu specific un break se va executa instructiunea de la urmatoarea # ramura 'case'. # Cu alte cuvinte pentru 'jpg' si 'jpeg' este aceeasi instructiune case 'jpeg': header( 'Content-type: image/jpeg' ); break; case 'html': # fisierul HTML va fi oferit spre download in loc sa fie afisat header( 'Content-type: text/html' ); break; case 'php': header( 'Content-type: application/x-httpd-php' ); break; /* aici pot fi definite oricate conditii */ default: # daca nici una din conditiile de mai sus nu a fost indeplinita # afisez ca text header( 'Content-type: text/plain' ); } # trimitem headerul prin care "fortam" download-ul. Partea "filename" din textul # de mai jos specifica numele sub care va fi propus spre download fisierul header("Content-Disposition: attachment; filename=\"download.$type\""); # trimit continutul fisierului de descarcat readfile( '.'.DIRECTORY_SEPARATOR.'resurse'.DIRECTORY_SEPARATOR.$_GET[ 'file' ] ); # alternativ de poate folosi // echo file_get_contents( './resurse/' . $_GET[ 'file' ] ); # nota: se pot specifica doar fisiere din folderul 'resurse', orice incercare de # a accessa alte fisiere este blocata } else { # nu a fost transmis parametrul file, fac redirect la pagina principala header( "Location: /" ); } exit; /* intrerup executia, desi nu e necesar in aceasta situatie fiind deja la sfarsitul scriptului */ ?>Puteti testa "in actiune" acest cod urmand urmatoarele link-uri:
- Imagine jpeg - link direct
- Imagine jpeg - link de download
- Document PDF - link direct
- Document PDF - link de download
Descarcati fisierul PHP si incercati-l pe serverul vostru.
Multumesc pentru fisier!Nu reuseam deloc sa downloadez fisierele care le bagasem deja in baza(doar calea). M-ai salvat!!
Adauga un comentariu la aceasta sectiune.
Nimic de afisat.
Adauga un comentariu la aceasta sectiune.