W3docs

$_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

ChiaveCosa 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_AGENT e qualsiasi altra chiave HTTP_* sono solo intestazioni di richiesta — un client malintenzionato può inviare qualsiasi cosa. Non stamparle mai in HTML senza escape (usa htmlspecialchars()), e valida HTTP_HOST tramite una lista di valori consentiti prima di usarla in un reindirizzamento.
  • PHP_SELF può contenere dati di percorso iniettati ed è una classica fonte di cross-site scripting (XSS) quando viene stampata nell'attributo action di 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 a REMOTE_ADDR per 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.

Pratica

Pratica
Quali informazioni può fornire la variabile superglobale PHP $_SERVER?
Quali informazioni può fornire la variabile superglobale PHP $_SERVER?
Was this page helpful?