CGI Common Gateway Interface
Hittills har vi skrivit HTML-filer i en editor av något slag. HTML-filen har sparats på din egen hårddisk eller på en serverdators hårddisk. HTML-filen har sedan hämtats med en webbläsare, tolkats och visats upp i dess fönster. Tills vi går in och ändrar i HTML-filen ser webbsidan exakt likadan ut. Innehållet är statiskt.
Med CGI däremot kan man skapa dynamiska webbsidor. Innehållet på sidorna kan påverkas av olika saker som till exempel tiden på dagen, vem som tittar på sidan, vilken webbläsare som används, innehållet i en databas, eller beroende på den information som användaren fyllt i i ett formulär.
Tekniskt fungerar det så att istället för att servern skickar en färdig HTML-fil till klienten, så startar servern ett dataprogram, ett CGI-program. Programmet gör någon form av beräkning eller databehandling, och lämnar sedan ifrån sig utdata som servern skickar till klienten. En sida som skapats på detta sätt är vanlig HTML, men HTML-koden sparas aldrig som en fil på en hårddisk, utan skapas "i farten" som utdata från ett CGI-program.
Indata till CGI-programmet kan bland annat tas från serverns systemklocka, filer på serverns hårddisk, från det som användaren har fyllt i i ett formulär eller från s.k. environment-variabler som innehåller information om uppkopplingen (se nedan).
CGI-programmet skrivs i något programmeringsspråk som går att köra på den dator som webbservern går på. Ett av de vanligaste programmeringsspråken för att skriva CGI-program är Perl, dels för att Perl går att köra på en mängd olika datorer utan större anpassningar, dels för att Perl är speciellt lämpat för de ganska enkla textfils- och textsträngshanteringar som det oftast är frågan om. Andra populära språk för att skriva CGI-program är shellscript, C, C++ och VisualBasic. Exemplen nedan är skrivna i Perl.
Oftast ska CGI-program ligga i en speciell cgi-bin-mapp för att servern ska veta att den ska köra (exekvera) programmen, och inte skicka filerna som vanligt. En del servrar går också att ställa in så att det går att köra CGI-program från vilken mapp som helst. I det fallet brukar filerna ha namn som slutar på .cgi. På Unix-servrar måste CGI-programmen dessutom göras executable med chmod för att fungera.
Slarvigt skrivna CGI-program kan öppna allvarliga säkerhetshål i webbservern. Webbhotell och internetleverantörer brukar därför i allmänhet ha särskilda restriktioner för CGI. En del tillåter inte alls CGI, andra vill kontrollera alla program innan de installeras. Några få webbhotell låter kunderna själva installera CGI-program. Kontrollera med ditt webbhotell vilka regler som gäller.
En sida som skapats av ett CGI-program har, precis som alla andra sidor, en webbadress, till exempel http://www.firma.se/cgi-bin/allan. När webbläsaren anropar servern och begär att få denna sida kommer alltså programmet "allan" att köras igång på serverdatorn, och utdata från det programmet (som t.ex. kan vara HTML-kod) skickas till webbläsaren.
Det är vanligt att man kommer till en CGI-genererad sida efter att ha fyllt i ett formulär. Sidans adress anges i formulärets ACTION-attribut. Oftast beror sidans utseende då på vad användaren fyllt i i formuläret. Man kan också komma till en CGI-genererad sida via en vanlig länk.
Att skriva CGI-program kräver kunskaper i programmering, och detta ligger utanför den här handledningen. Men jag ska ändå ge några upplysningar. Ett CGI-program måste alltid ge ifrån sig en eller flera s.k. HTTP-headers. Dessa kan bland annat ange vilken typ av data (mediatyp) som CGI-programmet ger till webbläsaren, eller att webbläsaren ska dirigeras om till en annan sida. Efter sista header-raden kommer alltid en blankrad, och i förekommande fall själva sidans innehåll (till exempel HTML-kod).
Vanliga header-rader när man skriver egna CGI-program är till exempel:
- Content-type: text/html
- Anger mediatypen (kallas även MIME-typ) och det är den som styr hur webbläsaren ska tolka CGI-programmets utdata. Är mediatypen text/html vet webbläsaren att den ska tolka HTML-koder, är mediatypen text/plain så kommer texten visas precis som den är, om mediatypen är image/gif så vet webbläsaren att filen är en GIF-bild etc.
- Location: http://www.server.se/mapp/fil.html
- Gör så att webbläsaren dirigeras om och laddar in det angivna dokumentet. Adressen anges som en absolut URL, d.v.s. börjar med http. Adressen i webbläsarens adressfält kommer att ändras till den nya adressen.
- Location: /mapp/fil.html
- Gör så att servern, istället för den begärda filen, skickar det angivna dokumentet. Filnamnet måste anges med full sökväg, d.v.s. börja med / Adressen i webbläsarens adressfält kommer inte att ändras.
- Status: 204 No Response
- Anger att webbläsaren inte ska vänta på data från servern. Detta används ifall ett CGI-program inte ska producera någon webbsida, utan göra något annat. Webbläsaren blir kvar på den sida den var och gör ingenting.
- Refresh: n
- Anges på en extra rad efter Content-type och tvingar webbläsaren att ladda om dokumentet efter n sekunder (se avsnittet om Client Pull).
- Refresh: n; URL=http://foo.bar/blatz.html
- Anges på en extra rad efter Content-type och tvingar webbläsaren ladda in dokumentet http://foo.bar/blatz.html efter n sekunder (se avsnittet om Client Pull).
- Window-target: window_name
- Anges på en extra rad efter Content-type och tvingar webbläsaren att öppna dokumentet i ett fönster med angivet namn (se avsnittet om FRAME och TARGET). Om det inte finns något fönster med det namnet så kommer ett nytt att öppnas.
- Set-Cookie: customer="768a5f"; path="/shop"; domain="firma.se"
- En s.k. magic cookie som skickas från servern (se avsnittet om Magic Cookies).
Alla dessa HTTP-headers ska ges på egna rader, och efter den sista av dem ska det alltid komma en blankrad innan innehållet som ska visas på sidan kommer. En blankrad ska alltid skickas, även om det inte kommer något mer data (som efter Location eller Status: 204 No Response).
Några enkla exempel skrivna i Perl:
Detta program genererar en sida med texten Hello World
#!/usr/local/bin/perl
print "Content-type: text/plain\n\n";
print "Hello World";
Notera att mediatypen är text/plain, d.v.s. ren, oformaterad text. Efter headerraden kommer två ny rad-tecken, dvs det blir en blank rad mellan HTTP-headern och texten.
Detta program genererar också en sida med texten Hello World
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<TITLE>Hello World</TITLE>Hello World";
Notera att mediatypen är text/html, d.v.s. HTML-kod, och att sidan har en titel.
Detta program dirigerar om webbläsaren till olika sidor beroende på om användaren kommer från en svensk domän eller ej. Indata tas från environment-variabeln REMOTE_HOST som innehåller namnet på anropande dator, och utdata är en Location-header.
#!/usr/local/bin/perl
$land = substr ($ENV{'REMOTE_HOST'},
rindex ($ENV{'REMOTE_HOST'}, "."));
if ($land eq ".se") { print "Location: /svensk-sida.html\n\n"; }
else { print "Location: /engelsk-sida.html\n\n"; }
Environment-variabler
Webbservern sätter ett antal environment-variabler som CGI-programmet kan läsa in och använda. Vilka variabler som kan användas skiljer sig något mellan olika servrar, men dessa är vanligt förekommande:
Dessa environment-variabler har hela tiden samma värde på en viss server:
- SERVER_SOFTWARE
- Webbserverns programvarunamn och version.
- SERVER_NAME
- Webbserverdatorns DNS-namn.
- SERVER_ADMIN
- E-postadress till serverns administratör.
- GATEWAY_INTERFACE
- Version av CGI-specifikationen som servern stöder.
- DOCUMENT_ROOT
- Fysisk sökväg till den mapp på servern där HTML-filerna ligger.
Dessa environment-variabler har olika värden beroende på klientens begäran om sidan:
- SERVER_PROTOCOL
- Version av HTTP-protokollet som begäran kom in med.
- SERVER_PORT
- IP-porten som begäran kom in till (vanligen port 80).
- REQUEST_METHOD
- Den metod som begäran görs med (GET, POST eller HEAD).
- REQUEST_URI
- Den virtuella sökväg som begäran görs till.
- PATH_INFO
- Extra path-information från klienten (kan användas för att ge programmet extra information via URL:en).
- PATH_TRANSLATED
- Samma som PATH_INFO, plus sökvägen till server root.
- SCRIPT_NAME
- Virtuell sökväg till CGI-programmet.
- SCRIPT_FILENAME
- Fysisk sökväg till CGI-programmet.
- QUERY_STRING
- Det som står efter ? i URL:en programmet anropades med.
- REMOTE_HOST
- Anropande dators namn (om servern gör namnuppslagning).
- REMOTE_ADDR
- Anropande dators IP-nummer.
- REMOTE_PORT
- Anropande dators portnummer.
- AUTH_TYPE
- Autentisieringsmetod för lösenordsskyddade CGI-program.
- REMOTE_USER
- Användarnamn som angetts vid en eventuell lösenordsruta.
- REMOTE_IDENT
- Användarnamn enligt RFC 931 (ovanligt).
- CONTENT_TYPE
- Mediatyp för det datablock med fomulärdata som sänds från webbläsaren.
- CONTENT_LENGTH
- Längd på datablock med fomulärdata som sänds från webbläsaren.
Alla HTTP-header-rader som klienten skickar till servern vid begäran om sidan läggs in som environment-variabler med namn som börjar på HTTP_ följt av headerns namn. Bindestreck i header-namnet ändras till understreck. Exempel på variabler som kan finnas (beror på klienten):
- HTTP_ACCEPT
- En lista på de mediatyper som webbläsaren kan hantera.
- HTTP_ACCEPT_CHARSET
- En lista på de teckenuppsättningar som webbläsaren kan hantera.
- HTTP_ACCEPT_LANGUAGE
- De språk som användaren föredrar.
- HTTP_COOKIE
- Magic cookie som skickas från webbläsaren (se detta avsnitt).
- HTTP_HOST
- Det datornamn som begäran riktades till.
- HTTP_REFERER
- Adressen till den webbsida som användaren länkar sig ifrån.
- HTTP_USER_AGENT
- Webbläsarens programvaruversion.
Copyright © Anders Hultman 1998-02-21