header în PHP

URL și HTTP PHP 4+

Trimite un antet HTTP către browser: redirecționare, tipul conținutului, descărcare de fișier, cache.

Sintaxă
header(string $header, bool $replace = true, int $response_code = 0): void

Ce face header

Înainte de conținutul paginii, serverul trimite browserului câteva rânduri numite antete HTTP. header îți permite să le setezi tu: Location pentru redirecționare, Content-Type pentru tipul conținutului (JSON, PDF, text), Content-Disposition pentru descărcare și altele.

Antetele trebuie trimise înainte de orice ieșire: niciun echo, niciun HTML, nici măcar un spațiu sau o linie goală înainte de <?php. Altfel primești Cannot modify header information - headers already sent.

header_remove("Nume") șterge un antet setat anterior, iar fără parametru le șterge pe toate.

Parametri

Parametru Descriere
$header Antetul complet, de forma "Nume: valoare".
$replace Opțional. true (implicit) înlocuiește un antet cu același nume. false adaugă încă unul.
$response_code Opțional. Setează și codul de răspuns HTTP, de exemplu 301.

Ce returnează

Nimic.

Exemple

Exemplul 1: Redirecționare către altă pagină

După Location pune mereu exit. Altfel scriptul continuă să ruleze și poate face lucruri nedorite.

<?php
header("Location: https://www.dexblog.ro/invata/php/", true, 301);
exit;

Răspunsul HTTP primit de browser

HTTP/1.1 301 Moved Permanently
Location: https://www.dexblog.ro/invata/php/

Exemplul 2: Răspuns JSON pentru un API

<?php
header("Content-Type: application/json; charset=utf-8");

echo json_encode(["succes" => true, "mesaj" => "Salvat"], JSON_UNESCAPED_UNICODE);

Răspunsul HTTP primit de browser

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"succes":true,"mesaj":"Salvat"}

Exemplul 3: Forțarea descărcării unui fișier

<?php
$fisier = "factura-1024.pdf";

header("Content-Type: application/pdf");
header('Content-Disposition: attachment; filename="' . basename($fisier) . '"');
header("Content-Length: " . filesize($fisier));
header_remove("X-Powered-By");

readfile($fisier);
exit;

Răspunsul HTTP primit de browser

HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="factura-1024.pdf"
Content-Length: 48213

Greșeli frecvente

  • Ai un spațiu, o linie goală sau un caracter BOM înaintea <?php, sau un echo înainte de header. Primești headers already sent. Verifică cu headers_sent().
  • Uiți exit după o redirecționare. Browserul pleacă, dar codul de mai jos se execută în continuare pe server.
  • Pui în antet date venite de la utilizator fără verificare, de exemplu header("Location: " . $_GET["url"]). Oricine poate redirecționa vizitatorii spre un site străin. Permite doar adrese din lista ta.

Comenzi înrudite

  • headers_sent / headers_list: Verifică dacă antetele HTTP au fost deja trimise și îți spune în ce fișier și pe ce linie a început afișarea.
  • http_response_code: Setează sau citește codul de stare HTTP al răspunsului: 200, 404, 500 etc.
  • setcookie: Trimite browserului un cookie: o valoare mică pe care browserul o păstrează și o trimite înapoi la fiecare cerere.
  • json_encode: Transformă un tablou sau obiect PHP în text JSON.