Headere 1
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 8
home
search
other
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;
?>
imi da eroare Object not found!
Exemplul nevalid functioneaza deoarece PHP face un fel de buffering la textul afisat cu "print". In mod normal, daca dupa instructiunea print se pune un flush() atunci n-ar mai merge.
"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."
Pentru a nu intampina astfel de probleme eu nu folosesc "?>" decat in interior, nu si la sfarsit. Astfel se ia in considerare totul pana la ultimul caracter(si nu pana la ?>). Eventualele spatii albe sau 'Enter-uri' de la sfarsit nu vor fi luate in considerare.
Aceasi eroare o am si eu la click pe search, home sau other ca si sergiu
Fisierul vostru trebuie sa se numeasca page.php pentru ca primul exemplu sa functioneze. Altfel veti primi acea eroare.
Aceasta eroare Object not found apare pentru ca http://www.google.ro nu e scris correct!
Incercati cu asta: https://www.google.ro Nu uitati sa adaugati acel https pentru site-uri securizate!
In exemplul tau link-ul doi se numeste tot home, ar trebui sa se numeasca search
Adauga un comentariu la aceasta sectiune.
Aplicatie: Sa se creeze o pagina care ofera spre download un document PDF, in loc sa-l deschida in browser 2
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
Document inexistent
Documentul nu a fost gasit.
Parametrul
file trebuie sa specifice un fisier existent in
folderul curent. Incercati din nou.";
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!!
am incercat pe serverul meu local acest cod si nu imi functioneaza. daca intru pe adresa locala si din click pe folderul creat pentru documentul pdf si acest script php, in momenutl in care dau clik pe download.php, iese din folder si nu se intampla nimic :|
Adauga un comentariu la aceasta sectiune.
- scuze pentru name-email, dar vreau sa raman anonim.
- tnx pentru munca depusa sa faci acest tutorial, este foarte util.
- daca vreodata o sa fac ceva bani in viata asta mea amarata, te voi recompensa :)
Adauga un comentariu la aceasta sectiune.