Corso di CGI

Le variabili d’ambiente

 

Guardarsi attorno

Abbiamo già accennato al fatto che i programmi CGI girano in un ambiente “protetto”, dove la loro esecuzione è controllata dal server web. La parola ambiente è forse usata un po’ a sproposito, ma in informatica si parla comunemente di “ambiente di esecuzione” riguardo a ciò che il programma sa del mondo esterno, e come comunica con esso.

A questo proposito, il server web comunica al nostro programma CGI una notevole quantità di informazioni. La maggior parte di esse si trovano nelle cosiddette variabili d'ambiente. Potete immaginarle come una serie di variabili già impostate alla partenza del vostro programma. In Perl, si trovano nell’array associativo %ENV. In C, potete usare la funzione getenv(). Vediamo un piccolo CGI in Perl che ci mostra tutte le variabili d’ambiente:

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>\n";
foreach (sort keys(%ENV))
                {
                print "$_: $ENV{$_}<BR>\n";
                }
print "</body></html>\n";


Date a questo script il nome che preferite e piazzatelo nella directory “cgi-bin”. Quindi aprite il vostro browser e accedete al seguente indirizzo:

http://localhost/cgi-bin/script.pl

dove “script.pl” e' il nome che avete dato allo script. Vedrete una serie di valori simile a questa:

DOCUMENT_ROOT: /opt/HTDOCS
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: image/gif, image/jpeg, image/png, */*

Impronte digitali

Ogni parola o frase in maiuscolo è il nome di una variabile d’ambiente, la parte dopo i due punti è il valore che le è stato assegnato dal server. Possiamo già vedere alcune cose interessanti:

HTTP_USER_AGENT: Mozilla/4.72 [en] (X11; U; Linux 2.2.14-5.0 i686)

La variabile HTTP_USER_AGENT dice al programma CGI quale browser e sistema operativo sta usando l’utente che lo ha fatto partire. Nel mio caso, dice che sto usando Netscape 4.72 con Linux. Nel vostro caso, sarà probabilmente diverso.

REMOTE_ADDR: 193.206.155.135

Nella variabile REMOTE_ADDR viene messo l'indirizzo IP dell'utente. Nel vostro caso, è probabilmente 127.0.0.1, oppure un qualche indirizzo 192.168.*

Come vedete, in due righe di programma si possono sapere molte cose riguardo al computer che ci sta visitando. Spesso queste informazioni sono molto utili: ad esempio, i webmaster a volte fanno pagine diverse per IE e per Netscape, viste le notevoli differenze tra i due browser. Questa riga di programma Perl:

$ie = ($ENV{"HTTP_USER_AGENT"} =~ m/MSIE/) ? 1 : 0;

esegue un semplice match per cercare la stringa "MSIE" nell’user agent. Se la trova, suppone che il browser sia Internet Explorer. Non è un metodo sofisticato, ma funziona abbastanza bene.

Un’altra variabile molto interessante è la HTTP_REFERER. Probabilmente, voi non la vedete, oppure se la vedete è vuota. Questa variabile contiene l’URL completo della pagina che ha chiamato lo script (con un link, un form o qualche altro metodo). Per il momento non contiene niente, perché appunto lo script non è stato chiamato da un’altra pagina: avete scritto direttamente il suo indirizzo. Ma in genere non è così, e si possono fare cose interessanti.

Ad esempio, il famoso contatore Shinystat è un CGI che manda in stdout un’immagine GIF, ed è inserito nel codice della pagina appunto come un’immagine, in questo modo:

<IMG SRC="http://www.shinystat.it/cgi-bin/shinystat.cgi?USER=pippo">

Per sapere a chi aumentare di uno il contatore, il CGI guarda la variabile HTTP_REFERER e scopre così in quale pagina era stato inserito. Non preoccupatevi della parte dopo il punto interrogativo, ci penseremo tra poco.

Ci sono molte altre variabili, alcune facili da capire, altre meno. Tenete d’occhio queste due:

QUERY_STRING:
REQUEST_METHOD: GET

Con ogni probabilità, la vostra QUERY_STRING è vuota, e il REQUEST_METHOD è vuoto oppure contiene "GET". Mediante queste due variabili d’ambiente un programma CGI riceve i dati da un form, quando viene premuto il tasto Submit. Ma qui sto sconfinando, e ce ne occuperemo nella prossima lezione.

 

Torna all'indice Generale del corso di Corso di CGI di Software Planet