Azt, hogy milyen egyéb változókat kap meg a CGI program a legegyszerűbben
egy kis CGI program lefuttatásával tudhatjuk meg:
#!/local/bin/perl
require 'state.pl';
print_http_state('200 OK');
print <<END;
Content-type: text/html
<HTML>
<BODY>
<b>Környezeti változók</b>
<HR>
<table border=0>
END
while( ($k,$v) = each %ENV ){
print "<tr><td><b>$k</b></td><td>$v</td></tr>\n";
}
print <<END;
</TABLE>
</BODY>
</HTML>
END
(Megjegyzés: Ne lepődjön meg senki, ha IIS alatt az AltiveState Perl interpretert használva
nem ezt az eredményt kapja.)
Nézzük meg, hogy mit ír ki ez a program az én gépemen:
SERVER_SOFTWARE Microsoft-IIS/3.0
SERVER_PORT_SECURE 0
PROCESSOR_IDENTIFIER x86 Family 5 Model 4 Stepping 3, GenuineIntel
PROCESSOR_ARCHITECTURE x86
OS Windows_NT
GATEWAY_INTERFACE CGI/1.1
REMOTE_ADDR 127.0.0.1
SERVER_PROTOCOL HTTP/1.1
SYSTEMROOT C:\WINNT
REQUEST_METHOD GET
REMOTE_HOST 127.0.0.1
COMSPEC C:\WINNT\system32\cmd.exe
HTTP_USER_AGENT Mozilla/4.0 (compatible; MSIE 4.0; Windows NT)
WINDIR C:\WINNT
PATH C:\Perl\bin;C:\WINNT\system32;C:\WINNT;
PROCESSOR_REVISION 0403
NUMBER_OF_PROCESSORS 1
HTTP_ACCEPT */*
HTTP_CONNECTION Keep-Alive
USERPROFILE C:\WINNT\Profiles\Default User
COMPUTERNAME VPHOME
HTTP_ACCEPT_LANGUAGE hu
SCRIPT_NAME /cgitutorial/listenv.plx
HTTP_ACCEPT_ENCODING gzip, deflate
SERVER_NAME localhost
PROCESSOR_LEVEL 5
OS2LIBPATH C:\WINNT\system32\os2\dll;
PATH_INFO /cgitutorial/listenv.plx
SERVER_PORT 80
CONTENT_LENGTH 0
HTTP_HOST localhost
PATH_TRANSLATED C:\InetPub\wwwroot\cgitut\source\cgi-bin\listenv.plx
SYSTEMDRIVE C:
Mivel ez a gép nincs az Internetre kötve azért meg merem mutatni ezeket a paramétereket,
bár meglehetősen sokat megmutat. Csak azokon a változókon megyünk végig, amelyek általában
minden webszerveren használhatóak, és amelyeket a portabilitás elvesztése nélkül bátran lehet
használni. (Vagy esetleg éppen a portabilitás elérése érdekében.)
SERVER_SOFTWARE
A webszerver szoftver megnevezése és verziója. Ezt péládul alkalmazni lehet ahhoz, hogy
kikerüljünk néhány rendszerspecifikus különbséget. Ilyen például az, hogy az IIS nem
fogadja el a Status sort, hanem helyette a HTTP/1.0 karaktersorozatot
kell kiküldeni. Ehhez a státusz kiírásához használhatjuk a kis apró
state.pl programot
sub print_http_state
{
my $state = shift;
if( $ENV{'SERVER_SOFTWARE'} =~ /IIS/ )
{
print "HTTP/1.0 $state\n"
}
else
{
print "Status: $state\n"
}
}
1;
(Ezt önnmagában nincs értelme lefuttatni még akkor sem, ha a jamal makró iderakja a futtatáshoz
szükséges linket.)
OS
Az operációs rendszer neve, amelyiket a Webszerver használ. Előfordulhatnak olyan kód darabok,
amelyek másként funkcionálnak a különböző operációs rendszereken, illetve más kódot kell
használni ugyanazon funkcionalitás elérése érdekében. Ezeknél a scripteknél figyelembe kell venni
ennek a környezeti változónak az értékét.
GATEWAY_INTERFACE
A webszerver szoftver és aprogram közötti felület neve és verziója. Ez szinte mindig
CGI/1.1
REMOTE_ADDR
A kliens gép IP címe. Ez a cím persze lehet, hogy nem a kliens címe, hanem
a proxy gép címe, amit a kliens használt. Amennyiben pedig a kliens és a szerver
között több proxy-n is keresztül megy a http folyam, akkor annak a proxy-nak a
címe amelyik a sorban a legutolsó, és a szerverhez a "legközelebb" van.
Nem lehet feltételezni, hogy egy IP címről csupán egy felhasználó jön, csak különleges esetben. Ilyen lehet az, amikor tudjuk, hogy az alkalmazást csak egy LAN-on belül fogják használni.
SERVER_PROTOCOL
Az a protokoll, amelyet a szerver használ. A HTTP/1.0 és a HTTP/1.1 között lényegi különbség
nincsen, csak egyészen kis apróságokban, főleg a proxy és a proxy cache kezelésében.
REQUEST_METHOD
Ez egy nagyon fontos környezeti változó. Ez a változó mondja meg, hogy a HTTP kérés típusa
milyen. Ez általában GET vagy POST. Ennek bővebb használatáról
külön fejezetben részletesen írunk.
REMOTE_HOST
A kliens gép neve. Általában nem lehet számítani rá, hogy ez a változó rendesen rendelkezésre
áll. Amikor egy gépnek nincs neve, csak ip száma, vagy a webszerver teljesítmény okok miatt
nem határozza meg a kliens tcp/ip nevét, akkor ez a változó vagy üres, vagy
általában az IP számot tartalmazza.
HTTP_USER_AGENT
A böngésző típusa. Akkor érdemes használni, ha olyan a program válasza, amely a különböző
böngészők számára különböző választ ad. Ilyen lehet például a frame használat.
HTTP_ACCEPT
Azoknak a MIME típusoknak a felsorolása, amelyeket a böngésző elfogad. Ha más típusú
információt adunk vissza, akkor feltehetőleg a böngésző nem fog tudni mit kezdeni vele.
Egy lynx például ebben a http fejlécben a text/* információt küldheti, aminek megfelelően
a gif képek helyett a program küldhet alternatív szöveget.
HTTP_ACCEPT_LANGUAGE
Azoknak a nyelveknek a listája, amelyeket a böngésző tulajdonosa beállított, hogy elfogad, el tud
olvasni. A program erre figyelhet, és amennyiben az információ, amelyet előállít több
nyelven is elérhető, akkor a legmegfelelőbbet választhatja ki.
SCRIPT_NAME
Ez egy nagyon fontos környezeti változó. Eleinte ugyannem használja az ember, de
bonyolultabb programok írásánűl igen gyakran előfordul, hogy olyan HTML fájlt jelenít meg a
program, amelynek bizponyos funkcióit követve újra ugyanaz a script indul el. Például egy
form kitöltése után ha az nincs teljesen kitöltve, akkor egy olyan oldalt jelenít meg
a program, amely figyelmeztet a hiányosságokra, és tartalmazza a form-ot a már beírt
információkkal. Természetesen ilyen esetben hivatkozni lehet a script nevére, de mi
történik akkor, ha valaki átnevezi a programot, és így akarja használni? Sokkal biztonságosabb, ha
ezta környezeti változót használjuk. Persze munkásabb is. De nem vészes:
#!/usr/bin/perl
require 'state.pl';
&print_http_state('200 OK');
$url = 'http://' .
$ENV{'SERVER_NAME'} .
$ENV{'SCRIPT_NAME'};
print <<END;
Content-type: text/html
<HTML>
<BODY>
Én <A HREF="$url">$url</A> vagyok.
</BODY>
</HTML>
END
SERVER_NAME
A szervergép neve. Ez is fontos lehet, ha a saját script teljes URL-jét akarjuk összeállítani.
PATH_INFO
SERVER_PORT
Annak a portnak a száma, ahol a szerver figyel.
CONTENT_LENGTH
Ez az információ akkor érdekes, ha POST típusú http kérést kell feldolgoznia a
cgi scriptnek. Ez a változó tartalmazza a http kérés tartalmának a hosszát. Ezt mindenképpen
tudni kell, mert csak innen lehettudni, hogy mikor van vége a http kérésnek. A http protokoll
ugyanis nem zárja le a http kérés végén a csatornát egy fájlvégjellel. Végülis ez
teszi lehetővé azt, hogy a http továbbfejlesztésében meg tudták valósítani a
keep-alive fogalmat.
HTTP_HOST
PATH_TRANSLATED
Megadja annak a könyvtárnak a helyét ahol a script valóban van.