Precedente Principale Sommario Informazioni Redazione Browser Successivo

Rubrica WebTech Coordinamento di Luciano Giustini

Note
L'articolo è disponibile anche in lingua inglese

CGI Corner

Informazioni generali - A cosa servono i CGI - Come funzionano i CGI - Configurazione del server - Le variabili d'ambiente

Questo vuole essere il primo di una serie di articoli dedicati alla programmazione della Common Gateway Interface (CGI)

di Michele Beltrame

Informazioni generali

In questo articolo voglio descrivere sommariamente la programmazione CGI (acronimo di Common Gateway Interface). Quando vedete su un sito Web cose come contatori di accessi, imagemap o pagine dinamiche, potete essere certi che esse sono state create utilizzando la tecnologia CGI.

Chiariamo subito che CGI non è un linguaggio di programmazione, bensì un'interfaccia con cui il client Web (il browser) puo` interagire con i programmi presenti sul server Web. I programmi CGI possono infatti essere scritti con il linguaggio di programmazione che si preferisce o piu` si conosce: C, C++, Pascal, SmallTalk, Python, Basic, .... Il linguaggio piu` usato per questi programmi è tuttavia il Perl, nato in ambiente Unix alcuni anni fa e per cui dobbiamo ringraziare soprattutto Larry Wall, il suo ideatore. I vantaggi derivanti dall'uso del Perl sono molteplici in quanto esso è facile da imparare, è dotato di potentissime funzioni ed operatori per la manipolazione delle stringhe, è molto portabile e ricco di estensioni. Il vostro server (o quello del vostro provider) dovrà tuttavia disporre di un interprete Perl, in quanto si tratta di un linguaggio interpretato (ad onor del vero ne esiste anche un compilatore, scritto da Malcom Beattie, ma è ancora in fase di alpha testing). Gli esempi che inseriro` in questi articoli sono tutti in Perl. In ogni caso, come detto prima, potete utilizzare il linguaggio di programmazione che desiderate. Potete trovare l'interprete Perl per vari sistemi operativi (oltre che per Unix, anche per Windows NT e molti altri) presso il sito www.perl.com di Tom Christiansen e anche su molti altri siti internet.

In questo articolo mi riferirò ai programmi in tecnologia CGI chiamandoli semplicemente CGI o programmi CGI. Non è proprio corretto, ma lo fanno tutti ed almeno è breve. ;-)


Ma cosa si fa con i CGI ?

Le applicazioni della programmazione CGI sono molte e sono quasi tutte volte a permettere una maggior interazione tra l'utente il server, cosa che non accade per le normali pagine HTML (eccezion fatta per i soli link). Ve ne sono tuttavia tre principali, dalle quali poi derivano molte delle altre.

Pagine dinamiche - Le pagine dinamiche, pittorescamente chiamate da alcuni pagine virtuali, sono pagine HTML che vengono create on the fly, cioé al volo, sul momento, come risposta ad una specifica richiesta del client oppure sulla base di dati che subiscono frequenti variazioni. Un esempio di pagina dinamica puo` essere il seguente:

Michele Beltrame home page
Sei il visitatore numero 330 e usi Mozilla/3.0 (X11; I; Linux 2.0.21 i586) come browser.

La pagina è chiaramente generata dinamicamente, in quanto vengono visualizzati dei dati non noti a priori al creatore del programma CGI (in questo caso il numero di accessi che la pagina ha avuto ed il nome del client).

Form - [Esempio form]Una delle applicazioni piu` utili in assoluto della tecnologia CGI è senz'altro la possibilità di gestire form in linea compilate dall'utente. Per le form possono essere utilizzati molti dei controlli tipici di qualsiasi interfaccia grafica: radio button, check box, list box, text area, .... Nella figura qui accanto potete vedere un esempio di form inserita in una pagina HTML. Le form sono di solito utilizzate per raccogliere informazioni dall'utente e poi memorizzarle in un database (oppure spedirle a qualche mailbox). Tuttavia tramite le form è anche possibile la creazione di pagine dinamiche sulla base di dati immessi dall'utente.

Gateway - Vi sono informazioni, come ad esempio il contenuto di un database o comunque file in formato diverso da quelli interpretabili dal client, che non possono essere direttamente accedute. Per superare questo problema è necessario ricorrere ai gateway, dei programmi che leggono un certo file e ne interpretano i contenuti, traducendoli in una forma leggibile dal client.


Come funziona l'interfaccia CGI

Per quelli di voi che sono interessati non solo a sapere come si usano i programmi CGI, ma anche a capire come funzionano ( e mi auguro siate molti ;-) ) scrivo qualche riga su come un CGI viene invocato dal client e su come esso ritorna al client il suo output. Un CGI viene invocato come qualsiasi altro documento HTML (viene cioé "richiesto"): il client invia al server qualcosa di questo genere:

GET /cgi-bin/booksearch.pl HTTP/1.0
Accept: text/html
Accept: text/plain
Accept: image/gif
Accept: image/jpeg
User-Agent: Mozilla/3.0 (X11; I; Linux 2.0.21 i586)

Nella prima linea sono riportati il nome del file richiesto (booksearch.pl nella directory /cgi-bin) ed il protocollo usato (HTTP 1.0). Nelle linee successive sono riportati i formati che il client accetta in risposta alla richiesta (in questo caso file di testo, file html, immagini gif ed immagini jpeg). Nell'ultima linea è infine riportato il nome del client (Netscape 3.0/Linux in questo caso). è possibile che nella richiesta siano presenti altre linee che ad esempio identificano l'utente, ma per capire il funzionamento dei CGI solo la prima linea è rilevante.

Se il server riceve una richiesta per un documento che si trova in una determinata directory (/cgi-bin in questo caso) o che ha una determinata estensione (potrebbe essere .cgi per i file che si trovano all'esterno della directory /cgi-bin), esso non manda il documento al client, ma lo esegue come si trattase di un file eseguibile (ed in effetti si tratta di un file eseguibile), inviandone l'output al client anziché al device standard (che ad esempio potrebbe essere il monitor). Tale output, affinché giunga correttamente al client, deve essere così strutturato :

HTTP/1.0 200 OK Date: Sunday, 22-September-96 11:09:00 GMT
Server: Apache/1.1.1
MIME-version: 1.0
Content-type text/html
Content-length: 4539

<HTML>
Pagina HTML creata dal CGI
</HTML>

Come vedete, dovrete restituire un documento con un header completo contente data, ora, nome del server, versione del protocollo MIME, tipo di contenuto e lunghezza del contenuto. In realtà nella maggior parte dei casi è sufficiente restituire un header parziale che specifica solo il tipo di contenuto :

Content-type: text/html

<HTML>
Pagina HTML creata dal CGI
</HTML>

Sarà il server a completare l'header con le informazioni mancanti. Questo semplifica notevolmente la creazione di pagine HTML dinamiche; ci sono tuttavia alcune circostanze, che vedremo in un futuro articolo, in cui è necessario usare gli header completi.


Configurazione del server

È necessario apportare alcune semplici modifiche alla configurazione del server affinchè l'interfaccia CGI funzioni correttamente. Molti di voi non avranno bisogno di smanettare nei file di configurazione, dal momento che il vostro provider avrà già sistemato tutto. In ogni caso mi sembra opportuno spendere due parole sull'argomento. Gli esempi di configurazione che ho inserito riguardano il server http Apache (ottenibile liberamente presso http://www.apache.org), ma funzionano anche con NCSA httpd. Per gli altri server non posso garantire. ;-)

Vi sono tre file di configurazione (che nella maggior parte dei casi si trovano in /usr/local/etc/apache/conf) : httpd.conf, access.conf e srm.conf.

In httpd.conf sarà necessario includere le seguenti direttive (o modificarle se già presenti ed impostate in altro modo):

  • <Directory /usr/local/business/http/italpro.com> - Questa direttiva deve puntare al path dove sono contenuti i vostri file html (il path DocumentRoot).

  • Options All - Questa direttiva definisce quali opzioni sono abilitate di default all'avvio di Apache. Esse possono essere "ExecCGI", "Indexes", "Includes" , "FollowSymLinks", "Multiview" o qualsiasi combinazione di queste; con "All" vengono abilitate tutte, con "None" nessuna. Le opzioni che servono per il corretto funzionamento dell'interfaccia CGI sono "ExecCGI" (che ne abilita l'esecuzione) e "Includes" (che abilita i Server Side Include, di cui parleremo in futuro). Attivarle tutte è una buona idea.

Passiamo a srm.conf :

  • DocumentRoot /usr/local/business/http/italpro.com - Come la direttiva "Directory" del file access.conf, anche questa deve puntare al path dove sono contenuti i vostri file html.

  • ScriptAlias /cgi-bin/ /usr/local/business/http/italpro.com/cgi-bin/ - Questa direttiva definisce una directory entro la quale qualsiasi file, indipendentemente dal suo nome o dalla sua estensione, è considerato un file eseguibile. Essa è quindi un buon posto per inserire i programmi CGI. Ricordate che è possibile avere anche piu` di una directory ScriptAlias. I parametri della direttiva sono l'alias, cioé il path virtuale (la directory root virtuale è la DocumentRoot) ed il path reale sull'hard disk dove verranno a trovarsi i CGI. Ciò significa che ad un richiesta da parte del client del tipo :
    http://www.italpro.com/cgi-bin/conta.pl
    verrà eseguito il programma :
    /usr/local/business/http/italpro.com/cgi-bin/conta.pl

  • AddHandler cgi-script .cgi - Questa direttiva istruisce il server affinché consideri CGI (cioé eseguibili) anche tutti i file fuori dalla directory /cgi-bin aventi estensione .cgi. È possibile utilizzare piu` di un'estensione: molta gente ad esempio fa riconoscere come CGI anche tutti i file con l'estensione .pl (Perl).

  • AddHandler server-parsed .shtml - Questa direttiva fa si che tutti i file con estensione .shtml vengano processati dal server prima di venire inviati al client. Ciò permette la ricerca da parte del server di chiamate a Server Side Include (di cui, come detto, parleremo nelle prossime puntate). È possibile anche impostare il server in modo che processi tutti i file con estensione .html e .htm, tuttavia ciò potrebbe rallentare la velocità di caricamento delle pagine.

Per ultimo analizziamo httpd.conf :

  • ServerRoot /usr/local/etc/apache - Indica la directory nelle cui subdirectory sono contenuti i file di configurazione ed i log.


Le variabili d'ambiente

Ok, configurato tutto... siamo pronti per cominciare con qualche semplice applicazione CGI. L'interfaccia CGI mette a disposizione dei programmi tutta una serie di variabili d'ambiente che forniscono le informazioni piu` disparate. Eccone una tabella riassuntiva, non preoccupatevi se di alcune non capite la funzione :

VariabileDescrizione
GATEWAY_INTERFACENumero di revisione della Common Gateway Interface utilizzata dal server
SERVER_NAMEIl nome o l'indirizzo IP del server
SERVER_SOFTWAREIl nome e la versione del server
SERVER_PROTOCOLIl nome e la versione del protocollo con cui è stata fatta la richiesta
SERVER_PORTIl numero di porta dell'host su cui il server è in esecuzione
REQUEST_METHODIl metodo con cui è stata inviata la richiesta
PATH_INFOInformazione "extra" di path passata al programma CGI
PATH_TRANSLATEDLa variabile PATH_INFO "tradotta"
SCRIPT_NAMEIl path virtuale del programma CGI che viene eseguito (es. /cgi-bin/booksearch.pl)
DOCUMENT_ROOTLa directory principale su cui si trovano i file html
QUERY_STRINGLa stringa contente le informazioni passate al programma. È aggiunta all'URL tramite un "?"
REMOTE_HOSTIl nome dell'host da cui proviene la richiesta
REMOTE_ADDRL'indirizzo IP dell'host da cui proviene la richiesta
AUTH_TYPEIl metodo di autenticazione usato per validare l'utente
REMOTE_USERIl nome dell'utente autenticato
REMOTE_IDENTIl nome dell'utente che ha mandato la richiesta. Questa variabile è, impostata solo se lo schema di identificazione RFC 931 è supportato dal client e se il flag NCSA IdentityCheck è attivato
CONTENT_TYPEIl tipo MIME dei dati passati al programma CGI (es. text/plain, text/html, ...)
CONTENT_LENGTHLa lunghezza in byte dei dati passati al programma CGI
HTTP_FROML'indirizzo e-mail dell'utente che compie la richiesta. Questa variabile non viene impostata dalla maggioranza dei browser
HTTP_ACCEPTUna lista di tipi MIME che il client accetta
HTTP_USER_AGENTIl nome del browser usato dal client
HTTP_REFERERLa URL del documento in cui si trovava il client prima di chiamare il programma CGI

Non tutti i server e non tutti i client impostano tutte queste variabili. Alcune potrebbero quindi non funzionare sempre.

Vediamo ora un semplice programma Perl che usi qualcuna delle variabili descritte nella precedente tabella :

#!/usr/bin/perl

print "Content-type: text/html\n\n"; # Indica il tipo MIME del documento

print "<HTML>\n";
print "<HEAD><TITLE>Prova CGI</TITLE></HEAD>\n"; # Invia l'header
print "<BODY>\n";
print "<P>Ciao!\n<BR>";
print "Provieni da ", $ENV{'REMOTE_HOST'}, "<BR>\n"; # Invia il nome dell'host su cui risiede il client
print "Usi ", $ENV{'HTTP_USER_AGENT'}, " come browser</P>\n"; # Invia il nome del browser
print "</BODY></HTML>";

exit (0);

È possibile chiamare questo programma da un qualsiasi documento HTML aggiungendoci un link. Ad esempio, poniamo che il CGI in questione si chiami infoclient.pl e si trovi nella directory /cgi-bin. La linea da aggiungere sarà la seguente:

<A HREF="/cgi-bin/infoclient.pl">Informazioni sul client</A>

Quando verrà invocato, il programma creerà una nuova pagina HTML (dinamica) che risulterà più o meno così :

Ciao!
Provieni da atlantis.io.com
Usi Mozilla/3.0 (X11; I; Linux 2.0.21 i586) come browser.

Dalle variabili d'ambiente vengono quindi estratti il nome dell'host su cui risiede il client ed il nome del browser. Tali dati vengono poi visualizzati all'utente. Questo è un esempio molto semplice, ma illustra chiaramente le potenzialità della tecnologia CGI.


Conclusione...

Mi auguro di essere riuscito nel mio intento di introdurre la programmazione CGI. Nel prossimo numero tratterò le form, quindi non azzardatevi a mancare. Ciao!


Bibliografia :
Larry Wall / Randal L. Schwartz - "Programming perl" - O'Reilly & Associates
Shishir Gundavaram - "CGI Programming on the World Wide Web" - O'Reilly & Associates
Apache Documentation - http://www.apache.org/docs/

Michele Beltrame è Webmaster del sito ItalPro ed è raggiungibile su Internet tramite la redazione


Copyright © 1996 BETA. Tutti i diritti riservati.


Precedente Principale Sommario Informazioni Redazione Browser Successivo