Internet: hogyan működik. CGI technológia – Common Gateway Interface
CGI technológia – Common Gateway Interface
CGI – Common Gateway Interface egy szabvány egy külső alkalmazási program interfészéhez (kommunikációjához). információs szerver típus HTTP, webszerver. A WWW szerverekről lekért hiperszöveges dokumentumok általában statikus adatokat tartalmaznak. A CGI-vel nevezett CGI programokat hozhatunk létre átjárók , amely az olyan alkalmazásrendszerekkel együttműködve, mint például adatbázis-kezelő rendszer, táblázatkezelő, üzleti grafika stb., képes lesz dinamikus információkat megjeleníteni a felhasználó képernyőjén.
Az átjáró programot a WWW szerver valós időben indítja el. A WWW szerver gondoskodik arról, hogy a felhasználó kérése az átjáróhoz kerüljön, az átjáró pedig az alkalmazásrendszer eszközeivel visszaküldi a kérés feldolgozásának eredményét a felhasználó képernyőjére. Az átjáró program C/C++, Fortran, Perl, TCL, Unix Schell, Visual Basic, Apple Script nyelven kódolható. Futtatható modulként a WWW szerver cgi-bin nevű alkönyvtárába íródik.
Adatátvitel átjárókhoz
Az információkérési adatok kiszolgálóról az átjáróra való átviteléhez a szerver a parancssort és a környezeti változókat használja. Ezek a környezeti változók akkor kerülnek beállításra, amikor a kiszolgáló végrehajtja az átjáró programot.
Lekérdezések különböző módszerekhez
Az információ a következő formában kerül továbbításra az átjárókhoz:
name=value&name1=value1&..,
Ahol név - név változó (az operátortól FORMA például), és az érték a valódi értéke. A kéréshez használt metódustól függően ez a karakterlánc vagy az URL részeként jelenik meg (a metódus esetén KAP), vagy tartalomként HTTP kérés (módszer POST). Ez utóbbi esetben ez az információ szabványos bemeneten kerül elküldésre az átjárónak.
A CONTENT_LENGTH bájt elküldésre kerül a szabványos bemeneti fájlleírónak. A szerver a CONTENT_TYPE (az átvitt adatok típusát) is elküldi az átjárónak. A kiszolgálónak nem kell fájlvégi karaktert küldenie, miután elküldte a CONTENT_LENGTH bájtnyi adatot, és miután az átjáró beolvassa azokat.
Példa
Vegyük példának egy űrlap POST metódussal történő futtatásának eredményét (METHOD="POST"). Kapjunk 7 bájtot, valahogy így kódolva:
a=b&b=c.
Ebben az esetben a szerver a CONTENT_LENGTH értéket 7-re, a CONTENT_TYPE értéket pedig application/x-www-form-urlencoded értékre állítja. Az átjáró szabványos bemenetének első karaktere "a" lesz, amit a kódolt karakterlánc többi része követ.
Parancssori argumentumok
Átjáró ide parancssor fogadja a szervertől:
- az URL fennmaradó része az átjáró neve után első paraméterként (az első paraméter üres lesz, ha csak az átjáró neve volt jelen), és
- kulcsszavak listája a keresési szkript parancssorának maradékaként, vagy
- váltakozó űrlapmezőnevek hozzáadott egyenlőségjellel (páros pozíciókban) és megfelelő változóértékekkel (páratlan pozíciókban).
A kulcsszavak, űrlapmezőnevek és értékek dekódolva (a HTTP URL kódolási formátumból) és újrakódolva kerülnek elküldésre a Bourne shell kódolási szabályai szerint, így a parancssori átjáró úgy kapja meg az információkat, ahogy vannak, anélkül, hogy szükség lenne rá. további konverziókat hajt végre.
FORM utasítás lekérdezések
A FORM utasítások feldolgozása úgy történik, hogy minden mezőnév paraméter egyenlőségjellel végződik, a maradék pedig a paraméter értéke. Ha van valami a szkript (átjáró) neve után, akkor ez az információ kerül átadásra első paraméterként. Ellenkező esetben az első paraméter üres lesz.
Példák:
A /htbin/foo/x/y/z?name1=érték1&name2=érték2 neve: /.../foo /x/y/z name1= value1 name2= value2 és a /htbin/foo?name1=value1&name2=value2 : /.../foo "" név1= érték1 név2= érték2
CGI környezeti változók
A következő környezeti változók nem kéréstípus-specifikusak, és minden kérelemhez be vannak állítva.
SERVER_SOFTWARE A kérésre válaszoló (és az átjárót futtató) információszerver neve és verziója. Formátum: név/verzió SERVER_NAME A szerver neve, amelyen a szerver fut, DNS név, vagy az URL-ben szereplő IP-cím.
GATEWAY_INTERFACE A CGI specifikáció verziója a kiszolgáló lefordítása idején. Formátum: CGI/verzió KAP, A következő környezeti változók különböző kérésekre vonatkoznak, és az átjáró hívása előtt kitöltésre kerülnek: SERVER_PROTOCOL Annak az információs protokollnak a neve és verziója, amelyben a kérés érkezett. Formátum: protokoll/verzió SERVER_PORT Portszám, amelyre a kérést küldték REQUEST_METHOD A kéréshez használt metódus. HTTP esetén ez, POST stb. PATH_INFO Az ügyfél által biztosított további elérési út-információk. Más szavakkal, az átjáró egy virtuális útvonalon keresztül érhető el, amelyet néhány követ további információk
. Ezt az információt továbbítottuk a PATH_INFO részére.
HTTP_ACCEPT A kliens által feldolgozható MIME-típusok listája a HTTP-fejlécekben meghatározottak szerint. Más protokolloknak ezeket az információkat más helyekről kell beszerezniük (ha szükségük van rá). A listában szereplő minden típust vesszővel kell elválasztani a HTTP-specifikációnak megfelelően. Formátum: típus/altípus, típus/altípus HTTP_USER_AGENT Megjelenítő, amelyet az ügyfél a kéréshez használ. Általános formátum: program/verziótár/verzió.
Információk kiadása az átjárón keresztül
Alapfogalmak
Az átjáró szabványos kimenetre adja ki a kimenetét. Ez a kimenet lehet egy, az átjáró által generált dokumentum, vagy egy utasítás a kiszolgálónak, hogy honnan szerezheti be a szükséges dokumentumot.
Általában az átjáró állítja elő a kimenetét, amelyet értelmez, és visszaküld a kliensnek. Ennek a megközelítésnek az az előnye, hogy az átjárónak nem kell minden kérésnél elküldenie a teljes HTTP/1.0 fejlécet.
Kimeneti fejléc
Egyes átjárók esetében el kell kerülni, hogy a szerver feldolgozza a kimenetüket, és közvetlenül kommunikáljon az ügyféllel. Az ilyen átjárók másoktól való megkülönböztetéséhez a CGI megköveteli, hogy nevük nph- előtaggal kezdődjön. Ebben az esetben az átjáró felelős azért, hogy szintaktikailag helyes választ adjon vissza az ügyfélnek.
Elemelt fejlécek
Az átjáró kimenete egy kis fejléccel kezdődik. Tartalmaz szöveges karakterláncok, ugyanolyan formátumban, mint a HTTP fejléc, és üres sorral végződik (csak soremelést vagy CR/LF karaktert tartalmaz).
Minden olyan fejlécsor, amely nem kiszolgálói direktíva, közvetlenül az ügyfélnek kerül elküldésre. Jelenleg a CGI specifikáció három szerver direktívát határoz meg: Content-type A visszaküldendő dokumentum MIME típusa.
Hely Ez a mező akkor használatos, ha jelezni kell a szerver felé, hogy nem magát a dokumentumot küldi vissza, hanem egy hivatkozást.
- Ha az argumentum egy URL, a szerver utasítja az ügyfelet a kérés átirányítására. Ha az argumentum egy virtuális elérési út, akkor a szerver visszaküldi az ezen elérési út által megadott dokumentumot a kliensnek, mintha az ügyfél közvetlenül kérte volna.
Állapot
Ez a direktíva arra szolgál, hogy a HTTP/1.0 kiszolgálót egy állapotkarakterláncra állítsa, amely elküldésre kerül az ügyfélnek. Formátum: nnn xxxxx, ahol az nnn egy 3 számjegyű állapotkód, az xxxxx pedig egy ok-karakterlánc, például "Tiltott".
Példák
Kimenet eleje - Tartalomtípus: text/html - kimenet vége - Most vegyük figyelembe az átjárót, amelynek bizonyos esetekben a /path/doc.txt dokumentumot kell kiadnia ennek a szervernek, mintha az ügyfél közvetlenül kérte volna a http://server:port/path/doc.txt fájlon keresztül. Ebben az esetben az átjáró kimenete a következő lenne: - a kimenet kezdete - Hely: /útvonal/doc.txt - kimenet vége - Végül tegyük fel, hogy az átjáró hivatkozásokat ad vissza a gopher szerverre, például a gopher:/ /gopher.ncsa.uiuc.edu/ . Az átjáró kimenete a következő lesz: - a kimenet kezdete - Hely: gopher://gopher.ncsa.uiuc.edu/ - a kimenet vége - Nem elemzett fejlécek
Tegyük fel, hogy van egy átjárónk, amely közvetlenül kommunikál az ügyféllel. Mint megjegyeztük, a nevének az nph- előtaggal kell kezdődnie, és érvényes HTTP-fejlécet kell visszaadnia. Ebben az esetben, ha az átjáróhoz HTTP/1.0-val egyenlő SERVER_PROTOCOL értékkel fértek hozzá, a kimenetének meg kell felelnie a HTTP/1.0 szabványnak:
Kimenet eleje - HTTP/1.0 200 OK Szerver: NCSA/1.0a6 Tartalomtípus: szöveg/sima - kimenet vége -
|
1) Általános információk a CGI-ről
1993 óta a CGI széles körben használt technológia a háromszintű kliens/szerver alkalmazások létrehozására az interneten. A CGI-alkalmazás a webszerverrel együtt alkalmazásszerverként működik egy háromszintű kliens/szerver architektúrában. A CGI egy olyan szabályrendszer (specifikáció), amely szerint a webszerveren elindított felhasználói programok HTML dokumentum formájában adatokat küldhetnek vissza a kliensnek. A CGI egy konzolalkalmazás, amely az ügyfél adatok lekérésére vagy frissítésére vonatkozó kérésére töltődik be, különálló, egyszálú folyamatként fut a webszerver irányítása alatt, és a befejezés után azonnal kiürül. A WinCGI a CGI Windows implementációja.
2) Megvalósítási lehetőségek
A webszerver által a CGI specifikációnak megfelelően futtatott programot CGI-szkriptnek nevezzük. Bármilyen programozási nyelven (C, Basic, Pascal stb.) vagy parancsnyelven (shell, perl stb.) írható, amely lehetővé teszi futtatható modulok létrehozását. A CGI-parancsfájl közvetítőként működik a webszerver és más szerverek, például adatbázis-kiszolgáló között, ezért gyakran átjárónak nevezik. Alapértelmezés szerint a CGI programok a C:\InetPub\Scripts|Cgi-bin könyvtárban találhatók, de létrehozhat saját virtuális könyvtárat.
3) A CGI és a WEB szerver közötti interakció módszerei
A CGI-specifikáció többféle interakciót biztosít a CGI program és a webszerver között, a szerver és a program közötti adatcsere típusától függően.
. Paraméterek átadása a parancssorban (például a szakaszban elhelyezett ISINDEX leíró használatával
. Környezeti változók értékeinek átadása (több mint 17 van).
. Adatátvitel szabványos bemeneti adatfolyamon (STDIN, STDOUT).
Az ISINDEX típusú kérés a következő formátumú kérés: http://site.ru/somthig-cgi/cgi-script?word1+word2+word3
Itt a legfontosabb a „?” szimbólum utáni szavak listája. A szavak a „+” jellel vannak felsorolva, és a cirill ábécé esetében nincsenek hexadecimális szekvenciákba kódolva. A szósor a "?" a QUERY_STRING környezeti változóba kerül.
A FORM-URLENCODED típusú kérés a következő formátumú kérés: http://site.ru/something-cgi/cgi-script?field=word1&field2=word2
Az űrlapadatok mező_név-érték párokként vannak írva, „&” karakterrel elválasztva.
Környezeti változók, amelyek nem függenek a kérés típusától:
SZERVER_SZOFTVER– megjeleníti a http szerver nevét és verzióját a következő formátumban: név/verzió.
SERVER_NAME– mutatja be domain név szerver.
SZERVER_ADDR– mutatja a szerver IP-jét.
SERVER_ADMIN– a webszerver rendszergazdájának e-mailje.
GATEWAY_INTERFACE– CGI verzió a httpd démon fordításának időpontjában a következő formátumban: CGI/verzió
DATE_GMT– aktuális dátum és idő a GMT időzónában.
DATE_LOCAL– aktuális dátum és idő a szerver időzónájában.
DOCUMENT_ROOT– elérési út a webszerver főkönyvtárához.
A kérés típusától függő környezeti változók:
SERVER_PROTOCOL– a jegyzőkönyv, amellyel a kérelem beérkezett.
SERVER_PORT– a kikötő, amelyen a kérés érkezett.
REQUEST_METHOD– kérés típusa: POST, GET és így tovább.
REQUEST_URL– a kérést küldő oldal.
SCRIPT_NAME– A szkript URL-je kiszolgálónév nélkül.
SCRIPT_FILENAME – a lemezen lévő szkriptfájl teljes neve.
QUERY_STRING– a szkripthívás parancssorában található információ (után? az URL-ben).
CONTENT_TYPE– A szkriptnek átadott MIME típusú adatok.
CONTONE_LENGTH– a továbbított adatok hossza.
Normál kimeneti adatfolyam:
Adatok bevitele a szkriptbe a szabványos bemeneti adatfolyamon keresztül csak akkor történik, ha az erőforráshoz (script) való hozzáférés POST módszerét használja. Ebben az esetben a CONTENT_LENGTH környezeti változó a szkript szabványos bemeneti adatfolyamából kiolvasandó karakterek számára van beállítva, a CONTENT_TYPE környezeti változó pedig a szabványos bemeneti adatfolyamból kiolvasott adatok kódolási típusára van állítva. Amikor karakterenként olvassa C nyelven, használhatja például a következő kódrészletet:
int n;
char *buf;
n=atoi(getenv(*CONTENT_LENGTH*));
buf=(char *)malloc(n+1);
memset(buf, '\000',n+1);
for (i=0; iBR> (buf[i]=getchar())
…
free(buf);
4) Adatátviteli módszerek
a) A GET metódus a környezeti változókon keresztül továbbítja az adatokat a CGI programnak, amelyek valójában a ? elválasztó karakteren keresztül kerülnek az URL-hez.
Mindenekelőtt a query_string változót használjuk erre a célra - egy hosszú karakterlánc, amely név = érték párokból áll, amelyeket egymástól a & jel választ el. Gyorsan kiderül, de az átvitt adatok mennyisége a webszerver típusától függően nem haladja meg a 256×1024 bájtot.
b) A POST metódus a szabványos stdin bemeneti adatfolyamon (Ini fájl WinCGI-hez) keresztül továbbítja az adatokat. Az adatok valójában a HTML-kérés törzséhez fűződnek. Az átvitt bájtok számát a content_length környezeti változó határozza meg. Ez lassabb módja az adatátvitelnek, de az átvitt adatok mennyisége nincs korlátozva.
c) Az A címke HREF paramétere
A GET és POST tag metódusok mellett