Környezeti változók

A CGI processz szinte minden paraméterét környezeti változókon keresztül kapja meg. Ezek a változók a Perl nyelvben a %ENV hash-ben vannak. A POST paraméterek kivételével, amelyeket a CGI processz a szabványos bemenetén (stdin) kap meg, minden mást a környezeti változókba rak a webszerver. A legfontosabb környezeti változó a QUERY_STRING amely a GET paramétereket tartalmazza és a REQUEST_METHOD amely azt mondja meg, hogy a kérés pontosan milyen típusú GET, POST, esetleg PUT vagy HEADER. Hogy pontosan hogyan kell felhasználni ezeket a változókat azt külön fejezetben tárgyaljuk részletesen, annyira fontos.

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.


Verhás Péter Home Page . . . . . . CGI röviden, tartalomjegyzék