$_SERVER
PHP è un linguaggio di scripting server-side. Scopri i superglobali e la variabile $_SERVER: chiavi principali, uso sicuro ed esempi pratici.
Comprendere i Superglobali PHP e la Variabile $_SERVER
PHP è un popolare linguaggio di scripting server-side utilizzato per lo sviluppo web. Una delle sue caratteristiche è l'insieme dei superglobali — variabili predefinite sempre disponibili in qualsiasi scope, quindi non è mai necessario dichiararle con la parola chiave global. Questo articolo si concentra sul superglobale $_SERVER: cosa contiene, le chiavi più utilizzate e come leggerlo in modo sicuro.
Per una panoramica di tutti i superglobali ($_GET, $_POST, $_SESSION, $_COOKIE e altri), consulta PHP Superglobals.
Cos'è la Variabile $_SERVER?
$_SERVER è un array associativo che il server web compila per ogni richiesta. Contiene informazioni sul server, sullo script corrente e sulla richiesta HTTP in arrivo — intestazioni, percorsi, metodo di richiesta, indirizzo IP del visitatore e alcune variabili d'ambiente di sistema.
Poiché è un array, si accede alle singole informazioni tramite chiave, ad esempio $_SERVER['REQUEST_METHOD'].
Chiavi comunemente utilizzate
| Chiave | Cosa restituisce |
|---|---|
$_SERVER['REQUEST_METHOD'] | Il metodo HTTP della richiesta (GET, POST, PUT, …). |
$_SERVER['REQUEST_URI'] | Il percorso e la query string dell'URL richiesto, es. /products?id=5. |
$_SERVER['QUERY_STRING'] | Solo la parte di query string dell'URL, es. id=5. |
$_SERVER['HTTP_HOST'] | L'host (e la porta) dall'intestazione Host della richiesta. |
$_SERVER['SERVER_NAME'] | Il nome dell'host come configurato sul server stesso. |
$_SERVER['HTTPS'] | Non vuoto quando la richiesta è stata effettuata tramite HTTPS. |
$_SERVER['REMOTE_ADDR'] | L'indirizzo IP da cui sembra provenire la richiesta. |
$_SERVER['HTTP_USER_AGENT'] | L'intestazione User-Agent del client (identità del browser/bot). |
$_SERVER['HTTP_REFERER'] | L'URL della pagina che ha collegato allo script corrente, se presente. |
$_SERVER['SCRIPT_FILENAME'] | Percorso assoluto nel filesystem dello script in esecuzione. |
$_SERVER['DOCUMENT_ROOT'] | Directory document root configurata per il sito. |
$_SERVER['PHP_SELF'] | Percorso dello script corrente relativo alla document root. |
$_SERVER['SERVER_PROTOCOL'] | Protocollo della richiesta, es. HTTP/1.1. |
Nota: Le chiavi presenti dipendono dal server web (Apache, Nginx + PHP-FPM, il server CLI integrato, …). Da riga di comando, molte chiavi relative alle richieste sono completamente assenti. Leggi sempre con attenzione — vedi la sezione sulla sicurezza di seguito.
Ispezionare $_SERVER
Quando non sei sicuro di cosa fornisce un determinato ambiente, scarica l'intero array:
<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';Questo stampa ogni coppia chiave/valore resa disponibile dal server per la richiesta corrente, che è il modo più rapido per scoprire su cosa puoi fare affidamento.
Ramificazione in base al metodo di richiesta
Un uso molto comune di $_SERVER è decidere cosa fare in base a come è stata richiesta la pagina. Una pagina con un form, ad esempio, mostra il form su una richiesta GET e processa i dati inviati su una richiesta POST:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Handle the submitted form data (validate, save, …)
echo 'Processing your submission';
} else {
// First visit — show the empty form
echo 'Showing the form';
}Questo pattern è la base della gestione dei form in PHP. Consulta PHP Form Handling e PHP Form Validation per il flusso di lavoro completo.
Costruire un URL di reindirizzamento
La funzione header() invia un'intestazione HTTP grezza — inclusa l'intestazione Location utilizzata per i reindirizzamenti. $_SERVER è utile per costruire la destinazione in modo dinamico, ad esempio per forzare HTTPS per la richiesta corrente:
<?php
// Redirect to the HTTPS version of the same URL when the request is plain HTTP
if (empty($_SERVER['HTTPS'])) {
$url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('Location: ' . $url, true, 301);
exit;
}header() deve essere chiamata prima che qualsiasi output (HTML, echo, o anche una riga vuota) venga inviato al browser. L'istruzione exit interrompe lo script in modo che non venga prodotto ulteriore contenuto dopo l'intestazione di reindirizzamento.
Utilizzo di $_SERVER per la Gestione degli Errori
Un altro utilizzo della variabile $_SERVER riguarda la gestione degli errori. Ad esempio, puoi usare il seguente codice per visualizzare una pagina di errore personalizzata per gli errori 404:
Gestione degli errori 404 in PHP con $_SERVER
<?php
// Log the error URI using $_SERVER
error_log('404 Error: ' . $_SERVER['REQUEST_URI']);
http_response_code(404);
include '404.html';
?>In questo esempio, $_SERVER['REQUEST_URI'] viene utilizzato per acquisire il percorso richiesto a scopo di registrazione. Invece di reindirizzare, lo script imposta il codice di stato HTTP corretto e include un template personalizzato, che è la pratica standard per la gestione degli errori.
Sicurezza: non fidarti dei valori controllati dal client
Alcune chiavi di $_SERVER provengono dalla richiesta e sono completamente controllate dal client, quindi possono essere falsificate. Trattale come input non attendibile:
HTTP_HOST,HTTP_REFERER,HTTP_USER_AGENTe qualsiasi altra chiaveHTTP_*sono solo intestazioni di richiesta — un client malintenzionato può inviare qualsiasi cosa. Non stamparle mai in HTML senza escape (usahtmlspecialchars()), e validaHTTP_HOSTtramite una lista di valori consentiti prima di usarla in un reindirizzamento.PHP_SELFpuò contenere dati di percorso iniettati ed è una classica fonte di cross-site scripting (XSS) quando viene stampata nell'attributoactiondi un form. Eseguine l'escape.REMOTE_ADDRè l'indirizzo del connettore; dietro un proxy o un load balancer, il vero IP del client potrebbe trovarsi in un'intestazione diversa. Non affidarti solo aREMOTE_ADDRper le decisioni di sicurezza.
Un modo sicuro per verificare una chiave mancante senza ricevere un avviso è l'operatore null-coalescing:
<?php
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
echo $method;Questo evita un avviso "undefined array key" quando la chiave non è impostata (ad esempio quando si esegue sotto CLI).
Conclusione
Il superglobale $_SERVER fornisce agli script PHP accesso ai dettagli della richiesta e dell'ambiente — il metodo HTTP, l'URL richiesto, l'host, i percorsi e l'IP del visitatore. Alimenta attività quotidiane come la gestione dei form basata sul metodo, i reindirizzamenti e la registrazione degli errori. Ricorda solo che le chiavi derivate dalle intestazioni sono controllate dal client: validale ed eseguine l'escape prima dell'uso.
Per approfondire, esplora i superglobali correlati: $_GET, $_POST e $_REQUEST.
Nota: In PHP moderno, il tag di chiusura ?> è opzionale e spesso omesso per evitare output accidentale di spazi bianchi.