PHP – Modificare l’header anche dopo l’inizio dell’invio della risposta

Man mano che il server elabora la risposta HTML comincia ad inviare le informazioni di intestazione, ovvero l’header del protocollo HTTP che contiene informazioni come per, esempio , il content-type e la codifica.

Una volta iniziato l’invio dell’header, tendenzialmente, non si possono aggiungere o modificare le intestazioni neanche con la funzione header() del PHP.

Per esempio non possiamo cambiare la location (effettuando un redirect) col seguente codice:

if($_POST[‘nomeVar’] == “sposta”)

{

echo “Adesso ti sposto”;
header(“location: daunaltraparte.php”);

}

Quindi la soluzione più valida è sicuramente quella di modificare opportunamente il codice per avere gli header tutti in testa (come suggerisce il nome), oppure abilitare il buffering direttamente da codice con le opportune funzioni PHP (il funzionamento dipende anche dall’hosting).

Ecco tre soluzioni alternative per abilitare il buffering:

  1. Nel php.iniabilitare l’opzione output_buffering = On.
  2. Abilitare nel codice ini_set(‘output_buffering’, ‘On’);
  3. Usare le funzioni ob_start(), ob_end_flush();

Il buffering inevitabilmente porterà una risposta HTTP inviata leggermente in ritardo al client, solitamente l’utente non ha alcuna percezione di questi tempi.

Modificare dinamicamente il Content Type di una JSP

Lavorando con il web capita non raramente di dover settare il valore del content-type all’interno dell’header di risposta.

In alcuni casi, addirittura può essere utile settare il content type dinamicamente a seconda della risposta che si sta esibendo.

Per settare il valore del content-type in una Java Server Page si può usare il seguente codice.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" %>

Ill valore dell’attributo contentType può specificare il formato (es. text/html, text/xml) e/o il charset (es. ISO-8859-1, UTF-8).

Si può anche scrivere direttamente il codice scriptlet modificando la response:

<% response.setContentType(“text/html; charset=ISO-8859-1”); %>

La comodità di questa soluzione è permette anche di utlizzare come valore di questo attributo una variabile, magari reperibile dalla request:

<% String r=(String)request.getAttribute(“responseType”);response.setContentType(r); %>