In (x)html e in tutti i linguaggi derivati da SGML e XML, alcuni caratteri sono "riservati": il carattere < serve per esempio ad indicare al parser l'inizio di un tag; per poter includere nei documenti questi caratteri riservati, vengono usate le entità, composte da:
Riprendendo l'esempio precedente, per visualizzare il carattere > è necessario nel codice utilizzare l'entità >
Attraverso le sessioni php è possibile memorizzare nel server alcuni dati relativi ad uno specifico utente. Per identificare i dati registrati nel server relativi all'utente il browser mantiene un identificativo, chiamato id di sessione, al quale i dati sono associati e lo invia ad ogni richiesta al server; questo id può essere registrato in un cookie, ma non tutti i browser (sai per loro natura che per impostazioni dell'utente) possono registrarli. Per risolvere questo inconveniente php può inviare l'id di sessione al server attraverso una query nel link della pagina.
Se la pagina non ha altri elementi nella query, l'uso di questo meccanismo non pone problemi: php automaticamente accoderà al link una query formata da ?PHPSESSID= con accodato l'id di sessione.
Qualora però vi sia già una query nel link, verrà accodato &PHPSESSID=.
Questo non crea problemi per l'utilizzo del sito ma ne crea per la validità della pagina secondo lo standard (x)html: viene difatti utilizzato il carattere riservato & non per identificare un'entità ma come carattere di accodamento
Ad esempio un url http://www.sito.it?lang=it diventerà http://www.sito.it?lang=it&PHPSESSID=01a44171360djj8b86297bc3f69906f5.
Esistono tre soluzioni per questo problema:
Le impostazioni di php possono essere settate in tre modi
php.ini: arg_separator.output = ";"
direttiva apache: php_value arg_separator.output ;
script: <?php ini_set('arg_separator.output',';'); ?>
php.ini: arg_separator.output = "&"
direttiva apache: php_value arg_separator.output &
script: <?php ini_set('arg_separator.output','&'); ?>
php.ini: session.use_trans_sid = 0
direttiva apache: php_value session.use_trans_sid 0
script: <?php ini_set('session.use_trans_sid','0'); ?>
Trovandosi a lavorare con hosting di terze parti, non è facilmente possibile richiedere la modifica del file php.ini o della configurazione di apache; le soluzioni possibili sono o l'inclusione di un file .htaccess o l'utilizzo della modalità script.
Anche in questo caso però ci possono essere delle limitazioni dettate dalla configurazione di apache.
Questo articolo è un riadattamento in italiano dell'articolo di David Dorward, Ampersands, PHP Sessions and Valid HTML, pubblicato dal w3c