Vannitoa renoveerimise portaal. Kasulikud näpunäited

Cgi näited. E-kaubandus - mis see on

9. peatükk.

CGI programmeerimine

CGI-teemalise jaotise lisamine andmebaasiraamatusse võib tunduda sama veider, nagu sisaldaks see kokaraamatusse autoremondi peatükki. Muidugi on toidupoodi minekuks vaja töökorras autot, aga kas sellest on kohane rääkida? Täielik sissejuhatus CGI-sse ja veebiprogrammeerimisse üldiselt ei kuulu selle raamatu raamesse, kuid nende teemade lühikesest sissejuhatusest piisab, et laiendada MySQL-i ja mSQL-i esitlusvõimalusi veebis.

See peatükk on mõeldud eelkõige neile, kes õpivad andmebaase, kuid soovivad omandada teadmisi ka veebiprogrammeerimisest. Kui teie perekonnanimi on Berners-Lee või Andreessen, ei leia te tõenäoliselt siit midagi, mida te juba ei tea. Kuid isegi kui te pole CGI-s uustulnuk, võib MySQL-i ja mSQL-i saladustesse sukeldumisel käepärast kiirviite olemasolu olla üsna kasulik.

Mis on CGI?

Nagu enamik akronüüme, ütleb ka Common Gateway Interface (CGI) sisuliselt vähe. Millega liides? Kus see värav asub? Millisest kogukonnast me räägime? Nendele küsimustele vastamiseks läheme veidi tagasi ja heidame pilgu WWW-le üldiselt.

CERNi füüsik Tim Berners-Lee leiutas veebi 1990. aastal, kuigi plaan pärineb aastast 1988. Idee oli võimaldada osakestefüüsika teadlastel hõlpsalt ja kiiresti jagada multimeediumiandmeid – teksti, pilte ja heli – läbi Interneti. WWW koosnes kolmest põhiosast: HTML, URL ja HTTP. HTML - vorminduskeel, mida kasutatakse sisu esitamiseks veebis. URL - see on aadress, mida kasutatakse HTML-i (või muu) sisu toomiseks veebiserverist. Ja lõpuks HTTP – see on keel, millest veebiserver aru saab ja mis võimaldab klientidel nõuda serverist dokumente.

Võimalus saata igat tüüpi teavet Interneti kaudu oli revolutsioon, kuid peagi avastati veel üks võimalus. Kui saate veebi kaudu saata mis tahes teksti, siis miks ei võiks te saata teksti, mis on loodud programmiga ja mitte võetud valmisfailist? Samal ajal avaneb võimaluste meri. Lihtne näide: saab kasutada programmi, mis kuvab praegust kellaaega, et lugeja näeks iga lehe vaatamise korral õiget aega. Mõned nutikad pead riiklikus superarvutirakenduste keskuses, kes ehitasid veebiserverit, nägid võimalust ja CGI tuli peagi kohale.

CGI on reeglite kogum, mille järgi saavad serveris olevad programmid veebiserveri kaudu klientidele andmeid saata. CGI spetsifikatsiooniga on kaasnenud muudatused HTML-is ja HTTP-s, mis tutvustab uut omadust, mida nimetatakse vormideks.

Kuigi CGI võimaldab programmidel andmeid kliendile saata, laiendavad vormid seda võimalust, võimaldades kliendil sellesse CGI-programmi andmeid saata. Nüüd ei saa kasutaja mitte ainult praegust kellaaega näha, vaid ka kella seada! CGI vormid on avanud ukse tõelisele interaktiivsusele veebimaailmas. Levinud CGI-rakendused hõlmavad järgmist:

  • Dünaamiline HTML. Terveid saite saab luua ühe CGI programmiga.
  • Otsingumootorid, mis leiavad kasutaja määratud sõnadega dokumente.
  • Külalisteraamatud ja teadetetahvlid, kuhu kasutajad saavad oma postitusi lisada.
  • Tellimuste vormid.
  • Küsimustikud.
  • Teabe hankimine serveris hostitud andmebaasist.

Järgmistes peatükkides käsitleme kõiki neid CGI-rakendusi, aga ka mõnda muud. Need kõik pakuvad suurepärast CGI-andmebaasi ühenduvust, mis meid selles jaotises huvitab.

HTML vormid

Enne CGI spetsiifikaga tutvumist on kasulik vaadata kõige levinumat viisi lõppkasutajatel CGI programmidega liidestamiseks: HTML-vormid. Vormid on osa HTML-keelest, mis pakub lõppkasutajale erinevat tüüpi välju. Väljadele sisestatud andmed saab edastada veebiserverisse. Väljasid saab kasutada teksti sisestamiseks või nupud, mida kasutaja saab klõpsata või linnukesega märkida. Siin on HTML-lehe näide, mis sisaldab vormi:

<НТМL><НЕАD><ТITLЕ>Minu vormide leht


<р>See on vormiga leht.


Sisestage oma nimi:



See vorm loob 40-märgilise stringi, kuhu kasutaja saab sisestada oma nime. Sisestusrea all on nupp, mida vajutades saadab vormi andmed serverisse. Järgmised on vormiga seotud sildid, mida toetab tänapäeval kõige laialdasemalt kasutatav standard HTML 3.2. Siltide ja atribuutide nimesid saab igal juhul sisestada, kuid järgime valikulist tava, et avasildid on suurtähed ja sulgevad sildid väiketähed.


See silt osutab vormi algusesse. Vormi lõpus on vaja sulgevat silti

... Siltide vahel
kolm atribuuti on lubatud: ACTION määrab URL-i või suhtelise tee CGI programmile, kuhu andmed saadetakse; METHOD määrab HTTP-meetodi, mille kaudu vorm esitatakse (see võib olla GET või h POST, kuid me kasutame peaaegu alati POST-i); ENCTYPE määrab andmete kodeerimise meetodi (seda tuleks kasutada ainult siis, kui on selge arusaam sellest, mida teete).


Pakub kasutajale kõige paindlikumat sisestusviisi. Tegelikult on üheksa erinevat tüüpi silte ... Tüübi määrab atribuut TYPE. Eelmises näites kasutatakse kahte silti : üks tüübiga ESITA ja teine ​​vaiketüübiga TEKST. Üheksa tüüpi on järgmised:

TEKST

Väli, kus kasutaja saab sisestada ühe tekstirea.

PAROOL

Sama mis TEKST, kuid sisestatud teksti ei kuvata ekraanil.

KONTROLL

Lipp, mille kasutaja saab määrata ja kustutada.

RAADIO

Raadionupp, mis tuleb kombineerida veel vähemalt ühe raadionupuga. Kasutaja saab neist valida ainult ühe.

ESITA

Nupp, millele klõpsamisel saadetakse vorm veebiserverisse.

RESET

Nupp, mis taastab klõpsamisel vormi vaikeväärtused.

FAIL

Sarnaselt tekstikastiga, kuid eeldab, et sisestate serverisse saadetava faili nime.

PEIDETUD

Nähtamatu väli, kuhu saab andmeid salvestada.

PILT

See sarnaneb nupuga ESITA, kuid nupul olevale pildile saab määrata pildi.

Lisaks atribuudile TYPE on sildid on tavaliselt atribuut NAME, mis seob väljale sisestatud andmed mõne nimega. Nimi ja andmed edastatakse serverile stiilis väärtus = väärtus. Eelmises näites kandis tekstivälja nime eesnimi. Saate kasutada atribuuti VALUE, et määrata eelmääratletud väärtused väljadele, mille tüüp on TEKST, PAROOL, FAIL ja HIDDEN. Sama atribuut, mida kasutatakse selliste nuppudega nagu ESITA või RESET, kuvab nende peal määratud teksti. RADIO ja CHECKBOX tüüpi välju saab kuvada eksponeerituna, kasutades atribuuti CHECKED ilma väärtust määramata.

Atribuuti SIZE kasutatakse TEXT, PASSWORD ja FILE tüüpi väljade pikkuse määramiseks. Atribuuti MAXLENGTH saab kasutada sisestatud teksti pikkuse piiramiseks. Atribuut SRC määrab tüübis IMAGE kasutatava pildi URL-i. Lõpuks määrab atribuut ALIGN, kuidas pilt on joondatud tüübi IMAGE jaoks ja see võib olla TOP, MIDDLE, BOTTOM (vaikeseade), LEFT või RIGHT (üles, keskel, alla, vasakule, paremale).

.

Nagu silt , sildil ja mis tahes tekst siltide vahel aktsepteeritakse vaiketekstina. , mis sarnaneb märgendi atribuudiga VALUE ... Sildi jaoks

, mis annab ruumi kontuuri sisestamiseks. Andmeid nimetatakse "esseeks". 70 tähemärki lai ja 10 rida sügav tekstiplokk. Tühikud siltide vahel

saab kasutada näidissketši jaoks. ->

tüübid vastavalt "ESITA" ja "RESET". Nupul "ESITA" on uuesti määratletud silt "Sisesta andmed" ja nupul "RESET" on vaikesilt (määratletud brauseri poolt). Vajutades nupule "ESITA" saadate andmed veebiserverisse, nupp "RESET" taastab andmed R algsesse olekusse, kustutades kõik kasutaja poolt sisestatud andmed. ->


Ainus sisestustüüp, mida me siin pole kasutanud, on sildi tüüp IMAGE ... Seda saab kasutada alternatiivse vormi esitamise viisina. Kuid tüüp IMAGE ühildub harva tekstipõhiste ja mitte väga reageerivate brauseritega, seega on mõistlik seda vältida, välja arvatud juhul, kui teie saidil on rikkalik graafiline stiil.

Nüüd, kui olete HTML-vormide põhitõdedega tuttav, võite hakata õppima CGI enda kohta.

CGI spetsifikatsioon

Mis siis täpselt on reeglistik, mis võimaldab näiteks Illinoisi osariigis Batavias asuval CGI-programmil suhelda Välis-Mongoolia veebibrauseriga? Ametliku CGI spetsifikatsiooni koos hulga muu CGI teabega leiate NCSA serverist aadressil http://hoohoo ... ncsa.uluc.edu/ cgi /. See peatükk on aga olemas selleks, et ei peaks kaua reisima ja seda ise otsima.

CGI edastab andmeid CGI npor raami ja veebiserveri ning seega ka veebikliendi vahel neljal viisil:

  • Keskkonnamuutujad.
  • Käsurida.
  • Standardne sisendseade.
  • Standardne väljundseade.

Nende nelja meetodi abil edastab server kõik kliendi saadetud andmed CGI programmi. Seejärel teeb CGI programm oma võlu ja saadab väljundi tagasi serverisse, mis edastab selle kliendile.

Need andmed on koos Apache HTTP-serveri hinnanguga. Apache on kõige laialdasemalt kasutatav veebiserver, mis töötab peaaegu igal platvormil, sealhulgas Windows 9x ja Windows NT. Neid saab aga rakendada kõikidele HTTP-serveritele, mis toetavad CGI-d. Mõnel patenteeritud serveril, näiteks Microsofti ja Netscape'i serveritel, võib olla lisafunktsioone või need võivad töötada veidi erinevalt. Kuna veebi nägu muutub jätkuvalt uskumatu kiirusega, arenevad standardid ikka veel ja kahtlemata on muudatusi ka tulevikus. Kui aga rääkida CGI-st, siis tundub, et tegemist on hästi väljakujunenud tehnoloogiaga – makstav hind on see, et teised tehnoloogiad, näiteks apletid, on selle tagasi lükanud. Kõik CGI-programmid, mille selle teabe abil kirjutate, on peaaegu kindlasti suutelised töötama enamikus veebiserverites veel aastaid.

Kui CGI-programmi käivitatakse vormi kaudu, mis on kõige tavalisem liides, saadab brauser serverisse pika stringi, mis algab CGI-programmi teest ja selle nimest. Sellele järgnevad mitmesugused muud andmed, mida nimetatakse teeinfoks ja mis edastatakse keskkonnamuutuja PATH_INFO kaudu CGI programmi (joonis 9-1). Teeteabele järgneb "?", millele järgneb vormiandmed, mis saadetakse serverisse HTTP GET-meetodi abil. Need andmed tehakse CGI-programmile kättesaadavaks keskkonnamuutuja QUERY_STRING kaudu. Kõik andmed, mida leht saadab HTTP POST-meetodil, mis on kõige sagedamini kasutatav meetod, edastatakse CGI-programmi standardsisendi kaudu. Tüüpiline string, mida server saab brauserist vastu võtta, on näidatud joonisel 1. 9-1. Programm nimega vormis lugeda kataloogis cgi-bin helistab server koos täiendava teeteabega Lisainformatsioon ja valik = abitaotluse andmed – ilmselt osana algsest URL-ist. Lõpuks saadetakse HTTP POST meetodi kaudu vormi enda andmed (tekst "CGI programmeerimine" väljal "märksõnad").

Keskkonnamuutujad

Kui server käivitab CGI-programmi, edastab ta sellele esmalt mõned andmed, et need töötaksid keskkonnamuutujate kujul. Seitseteist muutujat on spetsifikatsioonis ametlikult määratletud, kuid palju rohkem kasutatakse mitteametlikult allpool kirjeldatud mehhanismi kaudu, mida nimetatakse HTTP_ / nec / zams / n. CGI programm

on käsurealt käivitamisel juurdepääs neile muutujatele samamoodi nagu mis tahes kestakeskkonna muutujatele. Näiteks shelliskriptis saab keskkonnamuutujale F00 juurde pääseda kui $ F00; Perlis näeb see kõne välja nagu $ ENV ("F00"); C-s getenv ("F00"); ja nii edasi Tabelis 9-1 on loetletud muutujad, mille server alati määrab – vähemalt null. Lisaks nendele muutujatele määratakse kliendi poolt päringu päises tagastatud andmed muutujatele kujul HTTP_F00, kus F00 on päise nimi. Näiteks sisaldab enamik veebibrausereid versiooniteavet päises nimega USEfl_AGENT. Teie CGI-npor-frame saab need andmed saada muutujast HTTP_USER_AGENT.

Tabel 9-1.CGI keskkonnamuutujad

Keskkonna muutuja

Kirjeldus

CONTENT_LENGTH

POST- või PUT-meetodiga saadetud andmete pikkus baitides.

SISU TÜÜP

POST- või PUT-meetodiga lisatud andmete MIME-tüüp.

GATEWAY_INTERFACE

Serveri toetatud CGI spetsifikatsiooni versiooninumber.

PATH_INFO

Kliendi edastatud lisateave. Näiteks nõudma http://www.myserver.eom/test.cgi/this/is/a/ tee? väli = roheline muutuja PATH_ INFO väärtus on / see / on / a / tee.

PATH_TRANSLATED

Sama mis PATH_INFO, kuid server toodab kõik


Võimalik tõlge, näiteks nime laiendus nagu "-konto". "

QUERY_STRING

Kõik andmed pärast "?" URL-is. Need on ka andmed, mis saadetakse siis, kui vormi REQ-UEST_METHOD on GET.

REMOTE_ADDR

Taotluse esitanud kliendi IP-aadress.

REMOTE_HOST

Kliendi masina hostinimi, kui see on saadaval.

REMOTE_IDENT

Kui veebiserver ja klient toetavad autentimist identd, siis on see päringu esitanud konto kasutajanimi.

REQUEST_METHOD

Meetod, mida klient kasutab päringu tegemiseks. CGI-programmide puhul, mida me ehitame, on see tavaliselt POST või GET.

SERVER_NAME Masina hostinimi – või IP-aadress, kui nimi pole saadaval –, millel veebiserver töötab.
SERVER_PORT Veebiserveri kasutatav pordinumber.
SERVER_PROTOCOL
Protokoll, mida klient kasutab serveriga suhtlemiseks. Meie puhul on see protokoll peaaegu alati HTTP.
SERVER_TARKVARA Teave CGI-programmi töötava veebiserveri versiooni kohta.

SCRIPT_NAME

Käivitava skripti tee, nagu klient on määranud. Saab kasutada URL-ile viitamiseks iseendale ja selleks, et erinevates kohtades viidatud skriptid saaksid sõltuvalt kohast käitada erinevalt.

Siin on näide Perli CGI-skriptist, mis prindib välja kõik serveri poolt määratud keskkonnamuutujad, aga ka kõik päritud muutujad, näiteks PATH, mille on seadnud serveri käivitanud shell.

#! / usr / bin / perl -w

printida<< HTML;

Sisutüüp: tekst / html \ n \ n

<р>Keskkonnamuutujad

HTML

foreach (klahvid% ENV) (print "$ _: $ ENV ($ _)
\ n ";)

printida<

HTML

Kõiki neid muutujaid saab teie CGI programm kasutada ja isegi muuta. Need muudatused ei mõjuta aga programmi käivitanud veebiserverit.

Käsurida

CGI võimaldab argumente edastada CGI programmi käsurea parameetritena, mida kasutatakse harva. Seda kasutatakse harva, kuna selle praktilisi rakendusi on vähe ja me ei hakka sellel üksikasjalikult peatuma. Põhimõte on see, et kui keskkonnamuutuja QUERY_STRING ei sisalda sümbolit "=", siis käivitatakse CGI programm päringust QUERY_STRING võetud käsurea parameetritega. Näiteks, http://www.myserver.com/cgi- prügikast / sõrm? juur jookseb sõrmejuur peale www.myserver.com.

Perli jaoks on kaks peamist teeki, mis pakuvad CGI-liidest. Esimene on cgi-lib.pl Kasulikkus cgi-lib.pl väga levinud, kuna see oli pikka aega ainus suur raamatukogu. See on loodud töötama Perl 4-s, kuid see töötab ka Perl 5-ga. Teine teek, CGI.pm, uuem ja paljuski parem cgi-lib.pl. CGI.pm kirjutatud Perl 5 jaoks ja kasutab CGI andmetega töötamiseks täielikult objektorienteeritud raamistikku. Moodul CGI.pm parsib standardsisendi ja muutuja QUERY_STRING ning salvestab andmed CGI-objekti. Teie programm peab lihtsalt looma uue CGI-objekti ja kasutama soovitud andmete toomiseks lihtsaid meetodeid, nagu paramQ. Näide 9-2 on lühike demonstratsioon selle kohta, kuidas CGI.pm tõlgendab andmeid. Kõik selle peatüki Perli näited kasutavad CGI.pm.

Näide 9-2. CGI andmete sõelumine Perlis

#! / usr / bin / perl -w

kasuta CGI qw (: standard);

# Kasutatakse moodulit CGI.pm. qw (: standard) import

# saadaolevate standardsete CGI-funktsioonide nimeruum

# selgem kood. Seda saab teha, kui skript

# kasutatakse ainult ühte CGI-objekti.

$ mycgi = uus CGI; # Looge CGI-objekt, mis on vormiandmete "värav".

@fields = $ mycgi-> param; # Ekstraheerige kõigi täidetud vormiväljade nimed

print header, start_html ("CGI.pm test"); ft meetodid "header" ja "start_html",

# ette nähtud

# CGI.pm, muutke HTML-i hankimine lihtsaks.

# "päis" väljastab vajaliku HTTP-päise, a

# "start_html" kuvab HTML-i pealkirja antud nimega,

#a ka sildi .

printida"<р>Vormi andmed:
";

foreach (@väljad) (prindi $ _, ":", - $ mycgi-> param ($ _), "
"; }

# Printige iga välja jaoks kasutades saadud nimi ja väärtus

# $ mycgi-> param ("väljanimi").

print end_html; # Lühike lõpumärgendite väljastamiseks "".

Sisendandmete töötlemine C-vormingus

Kuna MySQL-i ja mSQL-i põhiliidesed on kirjutatud C-keeles, ei loobu me C-st täielikult Perli kasuks, vaid kui see on asjakohane, toome mõned näited C-s. CGI-programmeerimiseks on kolm laialdaselt kasutatavat C-teeki: cgic Tom Boutell *; cgihtml Eugene Kim t ja libcgi EIT-st *. Me usume seda cgic on kõige täiuslikum ja lihtsamini kasutatav. Sellel puudub aga võimalus loetleda kõik vormimuutujad, kui te neid eelnevalt ei tea. Tegelikult saab selle lisada lihtsa plaastriga, kuid see jääb sellest peatükist välja. Seetõttu kasutame näites 9-3 raamatukogu cgihtml, korrata ülaltoodud Perli skripti C-s.

Näide 9-3.CGI andmete sõelumine C-s

/* cgihtmltest.c – tüüpiline CGI programm võtmete ja nende väärtuste kuvamiseks

vormilt saadud andmetest * /

#kaasa

#include "cgi-lib.h" / * See sisaldab kõiki CGI funktsioonide määratlusi * /

#include "html-lib.h" / * See sisaldab "kõiki HTML-i abifunktsioonide määratlusi * /

tühine print_all (loetelu 1)

/ * Need funktsioonid väljastavad vormi edastatud andmed ülaltoodud Perli skriptiga samas vormingus. Cgihtml pakub ka sisseehitatud funktsiooni

Print_entries (), mis teeb sama HTML-loendivormingus. * / (

sõlm * aken;

/ * "Sõlm" tüüp on määratletud cgihtml teegis ja viitab lingitud loendile, mis salvestab kõik vormiandmed. * /

aken = I.pea; / * Määrab kursori vormiandmete algusesse * /

while (aken! = NULL) (/ * Liikuge lingitud loendist viimase (esimese tühja) elemendini * /

printf ("% s:% s
\ n ", aken-> kirje. nimi, asenda_ltgt (aken-> kirje.väärtus));

/ * Prindi andmed. Replace__ltgt () on funktsioon, mis mõistab teksti HTML-kodeeringut ja tagab selle õige kuvamise kliendi brauseris. * /

aken = aken-> järgmine; / * Liigu loendis järgmise üksuse juurde. * /

} }

int main () (

nimekirja kanded; / * Osuti sõelutud andmetele * /

int staatus; / * Olekut tähistav täisarv * /

HTML__päis (); / * HTML-i abifunktsioon, mis väljastab HTML-i päise * /

Html_begin ("cgihtml test");

/ * HTML-i abifunktsioon, mis kuvab määratud pealkirjaga HTML-lehe alguse. * /

olek = read_cgi_input (& kirjed); / * Sisestab ja sõelub vormi andmeid * /

Printf ("<р>Vormi andmed:
");

Prindi_kõik (kanded); / * Kutsub ülal määratletud funktsiooni print_all () välja. * /

html_end (); / * HTML-i abifunktsioon, mis prindib HTML-lehe lõpu. * /

List_clear (& kirjed); / * Vabastab vormiandmete poolt kasutatava mälu. * /

tagasi 0; )

Standardne väljundseade

CGI programmi poolt standardväljundisse saadetud andmed loeb veebiserver ja saadab need kliendile. Kui skripti nimi algab tähega nph-, seejärel saadetakse andmed otse kliendile ilma veebiserveri sekkumiseta. Sel juhul peab CGI programm genereerima õige HTTP-päise, millest klient aru saab. Vastasel juhul laske veebiserveril teie jaoks HTTP-päis genereerida.

Isegi kui te ei kasuta nph-script, tuleb serverile anda üks käsk, mis annab talle teavet teie väljundi kohta. Tavaliselt on see Content-Type HTTP-päis, kuid see võib olla ka päis Asukoht. Pealkirjale peab järgnema tühi rida, st reavahetus või CR / LF kombinatsioon.

Sisutüübi päis ütleb serverile, millist tüüpi andmeid teie CGI-programm tagastab. Kui see on HTML-leht, peab string olema sisutüüp: tekst / html. Asukoha päis ütleb serverile erineva URL-i või sama serveri erineva tee, kuhu klient suunata. Päis peaks välja nägema selline: Asukoht: http:// www. minu server. com / teine ​​/ koht /.

Pärast HTTP-päiseid ja tühja rida saate saata tegelikud andmed, mida teie programm toodab – HTML-lehe, pildi, teksti või mis iganes. Apache'iga kaasasolevate CGI-programmide hulgas on nph-test-cgi ja test-cgi, mis näitavad hästi erinevust nph ja mitte-nph päiste vahel.

Selles jaotises kasutame teeke CGI.pm ja cgic, millel on funktsioonid nii HTTP- kui ka HTML-päiste väljastamiseks. See võimaldab teil keskenduda tegeliku sisu kuvamisele. Neid abifunktsioone kasutatakse selle peatüki varasemates näidetes.

CGI skriptimise olulised omadused

Põhimõtteliselt teate juba, kuidas CGI töötab. Klient esitab andmed, tavaliselt vormi kaudu, veebiserverisse. Server käivitab CGI programmi, edastades sellele andmeid. CGI programm töötleb ja tagastab oma väljundi serverile, mis edastab selle kliendile. Nüüd, alates arusaamisest, kuidas CGI npor raamid töötavad, peate liikuma edasi mõistmiseni, miks neid nii laialdaselt kasutatakse.

Kuigi teate sellest peatükist juba piisavalt, et koostada lihtne ja töötav CGI-programm, tuleb enne tõeliselt töötava MySQL- või mSQL-programmi kirjutamist käsitleda veel mõnda olulist küsimust. Esiteks peate õppima, kuidas töötada mitme kujuga. Järgmiseks peate õppima mõned turvameetmed, mis takistavad ründajatel teie serveri failidele ebaseaduslikku juurdepääsu või nende hävitamist.

Olukorda meenutades

Oleku meeldejätmine on oluline vahend kasutajatele hea teeninduse pakkumiseks, mitte ainult paadunud kurjategijatega võitlemiseks, nagu võib tunduda. Probleemi põhjustab asjaolu, et HTTP on nn "no memory" protokoll. See tähendab, et klient saadab andmed serverisse, server tagastab andmed kliendile ja siis läheb igaüks oma teed. Server ei salvesta kliendi kohta andmeid, mida võib vaja minna järgnevates toimingutes. Samuti pole kindlust, et klient salvestab tehtud toimingu kohta mingeid andmeid, mida saab hiljem kasutada. See seab kohese ja olulise piirangu World Wide Webi kasutamisele.

Selle protokolliga CGI-skriptimine on analoogne vestluse meeldejätmise puudumisega. Alati, kui kellegagi räägite, hoolimata sellest, kui sageli olete temaga varem vestelnud, peate end tutvustama ja otsima ühist jututeemat. Ütlematagi selge, et see ei soodusta tootlikkust. Joonis 9-2 näitab, et kui päring jõuab CGI-programmi, on see programmi täiesti uus eksemplar, millel puudub seos eelmisega.

Kliendi poolel oli Netscape Navigatori tulekuga kiire välimusega lahendus, mida nimetatakse küpsisteks. See koosneb uue HTTP-päise loomisest, mida saab edasi-tagasi saata kliendi ja serveri vahel, sarnaselt sisutüübi ja asukoha päistele. Kliendi brauser, olles saanud küpsise päise, peab salvestama küpsises olevad andmed, samuti selle domeeni nime, milles see küpsis kehtib. Seejärel, kui külastatakse määratud domeeni URL-i, tuleb küpsise päis serverisse tagasi saata, et seda saaks kasutada selle serveri CGI programmides.

Küpsiste meetodit kasutatakse peamiselt kasutajatunnuse salvestamiseks. Külastajate teavet saab salvestada serverimasina faili. Selle kasutaja unikaalse ID saab saata küpsisena kasutaja brauserisse, misjärel iga kord, kui kasutaja seda saiti külastab, saadab brauser selle ID automaatselt serverisse. Server edastab ID CGI programmile, mis avab vastava faili ja pääseb ligi kõikidele kasutajaandmetele. Kõik see toimub kasutajale nähtamatul viisil.

Nii kasulik kui see meetod ka pole, ei kasuta enamik suuri saite seda oleku meeldejätmise ainsa vahendina. Sellel on mitu põhjust. Esiteks ei toeta kõik brauserid küpsiseid. Kuni viimase ajani ei toetanud vaegnägijatele (rääkimata ebapiisava internetiühenduse kiirusega inimestest) mõeldud põhibrauser - Lynx - küpsiseid. Ta ei toeta neid endiselt "ametlikult", kuigi mõned tema laialt levinud "kõrvalharud" seda teevad. Teiseks, mis veelgi olulisem, seovad küpsised kasutaja konkreetse masinaga. Üks suurepäraseid asju veebi juures on see, et sellele on juurdepääs kõikjalt maailmast. Sõltumata sellest, kus teie veebileht loodi või talletati, saab seda kuvada mis tahes Interneti-ühendusega masinas. Kui aga proovite pääseda ligi küpsisefaili toega saidile kellegi teise masinast, lähevad kõik küpsises hoitavad isikuandmed kaotsi.

Paljud saidid kasutavad endiselt küpsiseid kasutajalehtede isikupärastamiseks, kuid enamik täiendab neid traditsioonilise sisselogimis-/parooliliidesega. Kui saidile pääsetakse ligi brauserist, mis ei toeta küpsiseid, sisaldab leht vormi, kuhu kasutaja sisestab saidi esmakordsel külastamisel talle määratud registreerimisnime ja parooli. Tavaliselt on see vorm väike ja tagasihoidlik, et mitte hirmutada enamikku kasutajaid, kes pole huvitatud isikupärastamisest, vaid tahavad lihtsalt kaugemale minna. Pärast seda, kui kasutaja sisestab vormi sisselogimise ja parooli, leiab CGI faili selle kasutaja andmetega, nagu oleks nimi saadetud koos küpsisega. Seda meetodit kasutades saab kasutaja registreeruda isikupärastatud veebisaidile kõikjal maailmas.

Lisaks kasutaja eelistuste arvestamise ja tema kohta teabe pikaajalise säilitamise ülesannetele võib tuua peenema näite oleku salvestamisest, mille annavad populaarsed otsingumootorid. Kui otsite selliste teenustega nagu AltaVista või Yahoo, saate tavaliselt oluliselt rohkem tulemusi, kui on võimalik lihtsalt loetavas vormingus kuvada. Selle probleemi lahendamiseks kuvatakse väike arv tulemusi (tavaliselt 10 või 20) ja antakse mingisugune navigeerimisfunktsioon järgmise tulemuste rühma vaatamiseks. Kuigi see käitumine võib tavalisele veebirändurile tunduda tavaline ja ootuspärane, ei ole tegelik rakendamine triviaalne ja nõuab olekut.

Kui kasutaja esitab esimest korda otsingumootori päringu, kogub otsingumootor kõik tulemused, mis võib olla piiratud teatud eelmääratletud piiranguga. Trikk seisneb selles, et saada korraga väike arv tulemusi, jättes samal ajal meelde, milline kasutaja neid tulemusi taotles ja millist osa ta järgmisena ootab. Jättes kõrvale otsingumootori enda keerukuse, seisame silmitsi probleemiga pakkuda kasutajale järjestikku teavet ühel lehel. Mõelge näitele 9-4, mis näitab CGI-skripti, mis prindib failist välja kümme rida ja laseb sellel näha järgmist või eelmist kümmet rida.

Näide 9-4. Oleku salvestamine CGI-skriptis

#! / usr / bin / perl -w

kasutada CGI-d;

Ava (F, "/ usr / dict / words") või sure ("Ma ei saa avada! $!");

# See väljastatav fail võib olla ükskõik milline.

$ väljund = uus CGI;

sub print_range (# See on programmi põhifunktsioon, minu $ start = shift;

# Faili algusrida, minu $ count = 0;

# Osuti, minu $ rida = "";

# Faili praegune rida, prindi $ väljund-> päis,

$ output-> start_html ("Minu sõnastik");

# Loob HTML-i pealkirjaga "Minu sõnastik", printige " \ n ";

while (($ count< $start) and ($line = )) ($ count ++;)

# Jäta vahele kõik stardijoonele eelnevad read, while (($ count< $start+10) and ($line ? )) (prindi $ rida; $ count ++;)

# Printige järgmised 10 rida.

minu $ uusnext = $ algus + 10; minu $ uuseelmine = $ algus-10;

# Määrake URL-ide jaoks algsed read "Järgmine" ja "Eelmine",

printida"

";

välja arvatud juhul, kui ($ algus == 0) (# Lisage "Eelmine" URL, kui ainult teie

# ei ole enam alguses.

print qq% Eelmine%; )

välja arvatud juhul, kui (eof) (# Lisage "Järgmine" URL, kui ainult teie # mitte faili lõpus.

print qq% Järgmine%;

}

print "HTML;HTML

väljapääs (0); )

# Kui andmed pole saadaval, alustage otsast,

if (mitte $ output-> param) (

& printimisvahemik (0); )

# Vastasel juhul alustage andmetes määratud realt.

& print_range ($ väljund-> param ("start"));

Selles näites toimub oleku meeldejätmine kõige lihtsama meetodi abil. Andmete salvestamisega pole probleeme, kuna hoiame neid failis serveris. Peame ainult teadma, kust väljundit alustada, nii et skript sisaldab lihtsalt URL-i järgmise või eelmise ridade rühma alguspunkti – kõike seda, mida on vaja järgmise lehe loomiseks.

Kui aga vajate enamat kui lihtsalt faili ümberpööramist, võib URL-ile tuginemine olla tülikas. Seda raskust saab leevendada HTML-vormingu abil ja olekuteabe lisamisega siltidesse. tippige HIDDEN. Seda tehnikat on edukalt kasutatud paljudel saitidel, mis võimaldab luua linke seotud CGI programmide vahel või laiendada ühe CGI programmi kasutamist, nagu eelmises näites. Selle asemel, et linkida konkreetse objektiga, näiteks avalehega, võivad URL-i andmed osutada automaatselt loodud kasutaja ID-le.

Nii töötavad AltaVista ja teised otsingumootorid. Esimesel otsingul luuakse kasutaja ID ja peidetakse see järgmistesse URL-idesse. See ID on seotud ühe või mitme päringutulemusi sisaldava failiga. URL-is on veel kaks asja: praegune asukoht tulemuste failis ja suund, milles soovite selles edasi liikuda. Need kolm väärtust on kõik, mida on vaja suurte otsingumootorite võimsate navigatsioonisüsteemide käitamiseks.

Midagi on siiski veel puudu. Meie näites kasutatud fail / usr / dieet / sõnad väga suur. Mis siis, kui jätame selle lugemise keskele, kuid tahame selle juurde hiljem tagasi tulla? Järgmise lehe URL-i meelde jätmata pole enam võimalust tagasi minna, isegi AltaVista ei luba seda. Kui taaskäivitate arvuti või alustate töötamist mõnest muust arvutist, ei saa te naasta eelmiste otsingutulemuste juurde ilma päringut uuesti sisestamata. See pikaajaline olekulisus on aga ülalpool käsitletud veebisaidi isikupärastamise keskmes ja tasub vaadata, kuidas seda ära kasutada. Näide 9-5 on näite 9-4 muudetud versioon.

Näide 9-5. Stabiilne oleku meeldejätmine

#! / usr / bin / perl -w

kasutada CGI-d;

umask 0;

Ava (F, "/ usr / dict / words") või sure ("Ma ei saa avada! $!");

Chdir ("kasutajad") või die ("Ma ei saa $ kataloogi minna!");

# See on kataloog, kuhu kõik andmed salvestatakse.

# kasutaja kohta.

Väljund = uus CGI;

if (mitte $ output-> param) (

print $ väljund-> päis,

$ output-> start_html ("Minu sõnastik");

print "HTML;


<р>Sisestage oma kasutajanimi:


HTML

väljapääs (0); )

$ kasutaja = $ väljund-> param ("kasutajanimi");

## Kui kasutajafaili pole, looge see ja installige

## algväärtus "0"

if (mitte -e "$ kasutaja") (

avama (U, "> $ kasutaja") või surema ("Ma ei saa avada! $!");

prindi U "0 \ n";

sule U;

& printimisvahemik ("0");

## kui kasutaja on olemas ja pole URL-is määratud

## algusväärtus, loe viimane väärtus ja alusta sealt.

) elsif (mitte $ väljund-> param ("start")) (

Ava (U, "Kasutaja") või sure ("Kasutajat ei saa avada! $!");

$ algus = ; sule U;

chomp $ starl;

uprint range ($ algus);

## Kui kasutaja on olemas ja pole URL-is määratud

## algväärtus, kirjuta algväärtus

## kasutajafaili ja alustage väljastamist.

) muidu (

Ava (U, "> $ kasutaja") või sure ("Ma ei saa kasutajat kirjutamiseks avada! $!");

print U $ output-> param ("start"), "\ n";

sule U;

& print_range ($ väljund-> param ("algus 1));)

sub print_range (

minu $ algus = vahetus;

minu dollarite arv = 0;

minu $ rida = ""

print $ väljund-> päis,

$ output-> start_html ("Minu sõnastik");

printida"

\ n "; 

while (($ count< $start) and ($line = )) ($ count ++;)

while (($ count< $start+10) and ($line = ))

print $ rida; $ count ++;

minu $ uusnext = $ algus + 10;

minu $ uuseelmine = $ algus-10;

printida"

välja arvatud juhul, kui (Algus == 0)

{

printida

qq%

Eelmine%;

}

välja arvatud juhul, kui (eof) (prindi qq% Järgmine%;

# Pange tähele, et URL-ile lisatakse kasutajanimi "kasutajanimi".

# Vastasel juhul unustab CGI, millise kasutajaga ta tegeles.

}

print $ output-> end_html;

välju (0 ") ;

}

Turvameetmed

Interneti-serverite käitamisel, olgu need siis HTTP või muud serverid, on turvalisus suur probleem. Andmevahetus kliendi ja serveri vahel, mis toimub raamistikus

CGI tõstatab mitmeid olulisi andmekaitseprobleeme. CGI-protokoll ise on üsna turvaline. CGI programm saab andmeid serverist standardsete sisend- või keskkonnamuutujate kaudu, mis mõlemad on turvalised. Kuid kui CGI programm saab andmeid kontrolli alla, on selle toimingud piiramatud. Halvasti kirjutatud CGI programm võib võimaldada ründajal pääseda juurde serverisüsteemile. Vaatleme järgmist CGI-programmi näidet:

#! / usr / bin / perl -w

kasutada CGI-d;

minu $ väljund = uus CGI;

minu $ kasutajanimi = $ output "param (" kasutajanimi ");

print $ output-> header, $ output-> start_html ("Finger Output"),

"

"," sõrme $ kasutajanimi ","
", $ väljund-> lõpp_html;

See programm pakub käsule kehtiva CGI-liidese sõrm. Kui käivitate programmi just nagu sõrm.cgi, see loetleb kõik serveri praegused kasutajad. Kui käivitate seda nagu finger.cgi? kasutajanimi = fred, siis prindib see serverisse info kasutaja "fred" kohta. Saate seda isegi käivitada nagu sõrm. oo.com kaugkasutaja kohta teabe kuvamiseks. Siiski, kui sa jooksed seda nagu finger.cgi kasutajanimi = fred; võivad juhtuda soovimatud asjad. Perli kaldkriipsu operaator "" loob shellprotsessi ja käivitab käsu, mis tagastab tulemuse. Selles programmis" sõrme $ kasutajanimi * seda kasutatakse lihtsa viisina sõrmede otsimiseks ja väljundi hankimiseks. Kuid enamik kestasid võimaldab ühendada mitu käsku ühele reale. Näiteks iga protsessor, nagu Bourne'i protsessor, teeb seda kasutades "; ". Sellepärast"sõrm fred; post käivitab käsu esmalt sõrm ja siis käsk mail mis võib saata kogu serveri paroolifaili soovimatule kasutajale.

Üks lahendus on vormiandmete sõelumine pahatahtliku sisu leidmiseks. Võite näiteks otsida ";" ja eemaldage kõik järgmised märgid. Selline rünnak on võimalik alternatiivsete meetodite abil võimatuks teha. Ülaltoodud CGI programmi saab ümber kirjutada järgmiselt:

#! / usr / local / bin / perl -w

kasutada CGI-d;

minu $ väljund = uus CGI;

minu $ kasutajanimi = $ output-> param ("kasutajanimi");

$|++;

# Keela puhverdamine, et kõik andmed kliendile saata,

print $ output-> header, $ putput-> start_html ("Finger Output"), "

\ n "; 

$ pid = avatud (C_OUT, "- |"); # See Perli idioom loob alamprotsessi ja avaneb

# kanal vanema ja lapse protsesside vahel,

if ($ pid) (# See on vanemprotsess.

printida ; ft Trüki alamprotsessi väljund.

printida"

", $ väljund-> lõpp_html;

väljapääs (O); ft Lõpetage programm. )

elsif (määratletud $ pid) (# See on alamprotsess.

$ | ++; # Keela puhverdus.

exec ("/ usr / bin / finger", $ kasutajanimi) või die ("exec () kõne nurjus.");

# Käivitab sõrmeprogrammi, mille Susernimi on ainus
# käsurea argument. ) else (die ("ebaõnnestunud kahvel ()");)

# Vigade kontrollimine.

Nagu näete, pole see palju keerulisem programm. Aga kui sa seda teed nagu finger.cgi kasutajanimi = fred; siis käivitatakse sõrmeprogramm argumendiga fred; post ühe kasutajanimena.

Täiendava turvameetmena töötab see skript sõnaselgelt kui / usr / bin / finger. Ebatõenäolisel juhul, kui veebiserver annab teie CGI-programmile ebatavalise PATH-i, võib lihtsalt sõrme käivitamine põhjustada vale programmi käivitamise. Teise ohutusmeetme saab võtta, uurides PATH keskkonnamuutujat ja veendudes, et sellel on vastuvõetav väärtus. Hea mõte on praegune töökataloog PATH-ist eemaldada, välja arvatud juhul, kui olete kindel, et see pole nii, kui teil on tõesti vaja selles olevat programmi käivitada.

Teine oluline turvalisuse kaalutlus on seotud kasutajaõigustega. Vaikimisi käivitab veebiserver CGI programmi kasutajana, kes käivitas serveri ise. Tavaliselt on see pseudokasutaja, näiteks "keegi", piiratud õigustega, seega on ka CGI programmil vähe õigusi. Tavaliselt on see hea, sest kui ründaja saab CGI programmi kaudu ligipääsu serverile, ei saa ta suurt kahju teha. Paroolivarguse näidisprogramm näitab, mida saab teha, kuid tegelik kahju süsteemile on tavaliselt piiratud.

Piiratud kasutajana töötamine piirab aga ka CGI võimalusi. Kui CGI-programm peab faile lugema või kirjutama, saab ta seda teha ainult siis, kui tal on selleks luba. Näiteks oleku meeldejätmise teises näites säilitatakse iga kasutaja jaoks fail. CGI programmil peab olema lugemis-/kirjutusõigus neid faile sisaldavas kataloogis, rääkimata failidest endist. Seda saab teha, luues kataloogi sama kasutajana nagu server, millel on lugemis-/kirjutusõigus ainult sellele kasutajale. Kuid sellise kasutaja jaoks nagu "nobody" on see võimalus ainult root. Kui te pole superkasutaja, peate iga kord CGI muutmisel oma süsteemiadministraatoriga rääkima.

Teine võimalus on muuta kataloog lugemiseks ja kirjutamiseks vabaks, eemaldades sellelt tõhusalt igasuguse kaitse. Kuna nendele failidele pääseb välismaailmast juurde ainult teie programmi kaudu, pole oht nii suur, kui võib tunduda. Kui aga programmis leitakse auk, on kaugkasutajal täielik juurdepääs kõikidele failidele, sealhulgas võimalus need hävitada. Lisaks saavad serveris töötavad seaduslikud kasutajad neid faile muuta. Kui kavatsete seda meetodit kasutada, peavad kõik serveri kasutajad olema usaldusväärsed. Samuti kasutage avatud kataloogi ainult failide jaoks, mida CGI programm vajab; teisisõnu, ärge seadke tarbetuid faile ohtu.

Kui see on teie esimene katse CGI programmeerimisse, on selle edasiseks uurimiseks mitu võimalust. Sellel teemal on kirjutatud kümneid raamatuid, millest paljud ei tähenda programmeerimise tundmist. "CGI programmeerimine veebis" alates lihtsatest skriptidest mitmes keeles kuni tõeliselt hämmastavate nippide ja trikkideni firmalt O "Reilly and Associates. Avalikku teavet leidub ka WWW-s. CGI on tõesti lihtne(CGI kohta tõesti lihtne) aadressil http://www.jmarshall.com/easy/cgi/ .

CGI ja andmebaasid

Alates Interneti-ajastu algusest on andmebaasid suhtlenud ülemaailmse veebi arenguga. Praktikas peavad paljud veebi vaid üheks hiiglaslikuks multimeediumiandmebaasiks.

Otsingumootorid on igapäevane näide andmebaaside eelistest. Otsingumootorit ei saadeta kogu Internetis ringi liikuma, otsides märksõnu sel hetkel, kui neid otsite. Selle asemel kasutavad saidi arendajad muid programme, et luua hiiglaslik register, mis toimib andmebaasina, kust otsingumootor kirjed hangib. Andmebaasid salvestavad teavet viisil, mis võimaldab kiiret otsimist juhusliku juurdepääsuga.

Oma muutuvuse tõttu annavad andmebaasid veebile veelgi rohkem jõudu: muudavad selle potentsiaalseks liideseks kõige jaoks. Näiteks saab süsteemi administreerimist teha kaugjuhtimisega veebiliidese kaudu, selle asemel, et nõuda administraatorilt soovitud süsteemi registreerumist. Andmebaasi ühenduvus veebiga on Interneti interaktiivsuse uue taseme keskmes.

Üks põhjusi, miks andmebaasid on regulaarselt veebiga ühendatud, annab tunda: märkimisväärne osa maailma teabest on juba andmebaasides. Andmebaase, mis eksisteerisid enne veebi, nimetatakse pärandandmebaasideks (erinevalt hiljuti loodud võrguühenduseta andmebaasidest, mida tuleks nimetada "halvaks ideeks"). Paljud ettevõtted (ja isegi üksikisikud) seisavad nüüd silmitsi väljakutsega pakkuda neile pärandandmebaasidele veebi kaudu juurdepääsu. Välja arvatud juhul, kui teie pärandandmebaas on MySQL või mSQL, jääb see teema sellest raamatust välja.

Nagu varem öeldud, saab andmebaaside ja veebi vahelise suhtluse võimalusi piirata ainult teie kujutlusvõime. Nüüd on veebist juurdepääsetavad tuhanded ainulaadsed ja kasulikud andmebaasid. Väljaspool neid rakendusi töötavad andmebaaside tüübid on väga erinevad. Mõned neist kasutavad andmebaasiserveriga (nt MySQL või mSQL) liidestamiseks CGI-programme. Need tüübid pakuvad meile suurimat huvi. Teised kasutavad kaubanduslikke rakendusi, et suhelda populaarsete lauaarvuti andmebaasidega, nagu Microsoft Access ja Claris FileMaker Pro. Teised töötavad lihtsalt lamedate tekstifailidega, mis on võimalikult lihtsad andmebaasid.

Nende kolme tüüpi andmebaaside abil saate arendada igas suuruses ja keerukusega kasulikke veebisaite. Üks meie väljakutseid järgmiste peatükkide jooksul on MySQL mSQL-i võimsuse rakendamine veebis, kasutades CGI programmeerimist.

Tänu World Wide Webile saab peaaegu igaüks anda Internetis teavet silmale meeldival ja laialdaseks levitamiseks sobival kujul. Olete kahtlemata Internetis surfanud ja muid saite näinud ning nüüdseks ilmselt teate, et hirmuäratavad lühendid, nagu "HTTP" ja "HTML" on lihtsalt "veebi" ja "teabe väljendamise viisi Internetis" lühend. Teil võib olla juba teatav kogemus Internetis teabe esitamisel.

Internet on osutunud ideaalseks teabe levitamise vahendiks, mida näitab selle tohutu populaarsus ja laialdane areng. Kui mõned on seadnud kahtluse alla Interneti kasulikkuse ning seostavad selle laialdast arengut ja populaarsust peamiselt pealetükkiva reklaamiga, siis Internet on vaieldamatult oluline vahend igasuguse teabe esitamiseks. Lisaks sellele on palju teenuseid värskeima teabe (uudised, ilm, spordisündmused reaalajas) ja teatmematerjalide edastamiseks elektroonilisel kujul, vaid ka palju muud liiki andmeid. IRS, kes levitas kõik oma 1995. aasta maksudeklaratsiooni vormid ja muud teavet veebi kaudu, tunnistas hiljuti, et sai oma veebisaidi fännidelt kirju. Kes oleks võinud arvata, et IRS saab kunagi fännikirju? Seda mitte sellepärast, et tema veebisait oli hästi kujundatud, vaid see, et see osutus tõeliselt kasulikuks tööriistaks tuhandete, kui mitte miljonite inimeste jaoks.

Mis teeb veebi ainulaadseks ja nii atraktiivseks teabeteenuseks? Esiteks selles, et see pakub andmetele hüpermeediumiliidest. Mõelge oma arvuti kõvakettale. Tavaliselt väljendatakse andmeid lineaarselt, sarnaselt failisüsteemiga. Näiteks on teil mitu kausta ja iga kausta sees on kas dokumendid või muud kaustad. Veeb kasutab teabe väljendamiseks teistsugust paradigmat, mida nimetatakse hüpermeediaks. Hüperteksti liides koosneb dokumendist ja linkidest. Lingid on sõnad, millel klõpsatakse muude dokumentide vaatamiseks või muud tüüpi teabe leidmiseks. Veeb laiendab hüperteksti mõistet, et hõlmata ka muud tüüpi meediume, nagu graafika, helid, video (sellest ka nimi "hüpermeedia"). Dokumendi teksti või graafika esiletõstmine võimaldab teil näha esiletõstetud üksuse kohta seotud teavet mis tahes kujul.

Sellest lihtsast ja ainulaadsest teabe esitamise ja levitamise viisist saavad kasu peaaegu kõik, alates akadeemikutest, kes soovivad koheselt oma kaaslastega andmeid jagada, kuni ärimeesteni, kes jagavad oma ettevõtte kohta teavet kõigiga. Kuigi teabe edastamine on äärmiselt oluline, on viimastel aastatel paljud tundnud, et teabe hankimine on sama oluline protsess.

Kuigi veeb pakub teabe jaoks ainulaadset hüpermeediumiliidest, on andmete levitamiseks palju muid tõhusaid viise. Näiteks võrguteenused, nagu failiedastusprotokoll (FTP) ja uudisterühm "Gopher", eksisteerisid ammu enne World Wide Webi tulekut. Elektronpost on olnud Interneti ja enamiku teiste võrkude kaudu suhtlemise ja teabevahetuse peamine vahend peaaegu nende võrkude loomise algusest peale. Miks on Internet muutunud nii populaarseks teabe levitamise viisiks? Interneti multimeediaaspekt on selle enneolematusse edusse käegakatsutavalt kaasa aidanud, kuid selleks, et Internet oleks kõige tõhusam, peab see olema interaktiivne.

Ilma võimaluseta kasutajatelt sisendit vastu võtta ja teavet edastada oleks veeb täiesti staatiline keskkond. Teave oleks saadaval ainult autori määratud vormingus. See kahjustaks üht arvutusvõimalust üldiselt: interaktiivset teavet. Näiteks selle asemel, et sundida kasutajat vaatama mitut dokumenti nii, nagu ta vaataks raamatut või sõnastikku, oleks parem lasta kasutajal tuvastada teda huvitava teema märksõnad. Kasutajad saavad andmete esitusviisi kohandada, mitte tugineda sisupakkuja määratletud jäigale struktuurile.

Mõiste "veebiserver" võib olla eksitav, kuna see võib viidata nii füüsilisele masinale kui ka tarkvarale, mida see Interneti-brauseritega suhtlemiseks kasutab. Kui brauser küsib antud veebiaadressi, loob see esmalt ühenduse masinaga Interneti kaudu, saates veebiserveri tarkvarale dokumendipäringu. See tarkvara töötab pidevalt, ootab selliseid päringuid ja vastab neile.

Kuigi serverid saavad andmeid saata ja vastu võtta, on serveri enda funktsionaalsus piiratud. Näiteks kõige primitiivsem server suudab brauserisse saata ainult vajaliku faili. Server tavaliselt ei tea, mida selle või teise lisasisendiga peale hakata. Kui Interneti-teenuse pakkuja ei ütle serverile, kuidas seda lisateavet käsitleda, ignoreerib server tõenäoliselt seda sisendit.

Selleks, et server saaks peale failide otsimise ja Interneti-brauserisse saatmise teha muid toiminguid, peate teadma, kuidas serveri funktsionaalsust laiendada. Näiteks ei saa veebiserver otsida andmebaasist kasutaja sisestatud märksõna alusel ja tagastada mitut sobivat dokumenti, välja arvatud juhul, kui selline võimalus on serveri jaoks mingil viisil programmeeritud.

Mis on CGI?

Common Gateway Interface (CGI) on serveri liides, mis võimaldab serveri funktsionaalsust laiendada. CGI abil saate interaktiivselt töötada teie saiti külastavate kasutajatega. Teoreetilisel tasandil võimaldab CGI laiendada serveri võimet sõeluda (tõlgendada) brauseri sisendit ja tagastada teavet kasutaja sisendi põhjal. Praktilisel tasandil on CGI liides, mis võimaldab programmeerijal kirjutada programme, mis lihtsalt suhtlevad serveriga.

Tavaliselt peate serveri võimaluste laiendamiseks serverit ise muutma. See lahendus ei ole soovitav, kuna see nõuab Interneti-protokolli võrgu programmeerimise alumise kihi mõistmist. See nõuaks ka serveri allika redigeerimist ja uuesti kompileerimist või iga ülesande jaoks kohandatud serveri kirjutamist. Oletame, et soovite laiendada oma serveri võimalusi nii, et see toimiks veebist meili (veebist meili) lüüsina, tõmbab brauserist kasutaja sisestatud teabe ja saadab selle teisele kasutajale meili teel. Server peaks sisestama koodi, et sõeluda brauserist sisend, saata see teisele kasutajale meiliga ja saata vastus võrguühenduse kaudu brauserisse tagasi.

Esiteks nõuab selline ülesanne juurdepääsu serveri koodile, mis pole alati võimalik.

Teiseks on see keeruline ja nõuab ulatuslikke tehnilisi teadmisi.

Kolmandaks, see kehtib ainult konkreetse serveri jaoks. Kui teil on vaja oma server teisele platvormile teisaldada, peate selle käivitama või vähemalt kulutama palju aega koodi sellele platvormile teisaldamiseks.

Miks CGI?

CGI pakub nendele probleemidele kaasaskantavat ja lihtsat lahendust. CGI-protokoll määratleb standardse viisi, kuidas programmid suhtlevad veebiserveriga. Ilma eriteadmisteta on võimalik kirjutada programm mis tahes masinkeeles, mis liidestub ja suhtleb veebiserveriga. See programm töötab kõigi veebiserveritega, mis mõistavad CGI-protokolli.

CGI-suhtlus toimub standardse sisendi ja väljundiga, mis tähendab, et kui tead, kuidas oma programmeerimiskeelt kasutades andmeid printida ja lugeda, saad kirjutada veebiserveri rakenduse. Peale sisendi ja väljundi sõelumise on CGI-rakenduste programmeerimine peaaegu samaväärne mis tahes muu rakenduse programmeerimisega. Näiteks programmi "Tere, maailm!" programmeerimiseks kasutate sobiva sõnumi printimiseks oma keele printimisfunktsioone ja CGI-programmidele määratud vormingut.

Programmeerimiskeele valik

Kuna CGI on üldine liides, ei piirdu te ühegi konkreetse masinakeelega. Sageli küsitakse olulist küsimust: milliseid programmeerimiskeeli saate CGI programmeerimiseks kasutada? Võite kasutada mis tahes keelt, mis võimaldab teil:

  • Printige standardväljundisse
  • Loe stdinist
  • Loe muutuvatest režiimidest

Peaaegu kõik programmeerimiskeeled ja paljud skriptikeeled teevad neid kolme asja ja saate kasutada mõnda neist.

Keeled jagunevad ühte kahest järgmisest klassist: tõlgitavad ja tõlgitavad. Tõlgitud keel – näiteks C või C ++ on tavaliselt väiksem ja kiirem, samas kui tõlgitud keeled, nagu Perl või Rexx, nõuavad mõnikord käivitamisel suure tõlgi laadimist. Lisaks saate levitada binaarfaile (masinakeelde tõlgitud kood) ilma lähtekoodita, kui teie keel on tõlgitav. Tõlgendatud skriptide levitamine tähendab tavaliselt lähtekoodi levitamist.

Enne keele valimist peate esmalt kaaluma oma prioriteete. Peate hindama ühe programmeerimiskeele kiiruse ja tõhususe eeliseid ning teise programmeerimise lihtsust. Kui teil on soov õppida mõnda teist keelt, siis selle asemel, et kasutada seda, mida te juba oskate, kaaluge hoolikalt mõlema keele eeliseid ja puudusi.

Kaks kõige sagedamini kasutatavat keelt CGI programmeerimiseks on C ja Perl (mõlemad on selles raamatus käsitletud). Mõlemal on selged eelised ja puudused. Perl on väga kõrgetasemeline keel ja samas võimas keel, mis sobib eriti hästi teksti parsimiseks. Kuigi selle kasutuslihtsus, paindlikkus ja võimsus muudavad selle CGI-programmeerimise jaoks atraktiivseks keeleks, muudavad selle suhteliselt suur suurus ja aeglasem jõudlus mõnikord mõne rakenduse jaoks sobimatuks. C-programmid on väiksemad, tõhusamad ja tagavad madalama taseme süsteemijuhtimise, kuid neid on keerulisem programmeerida, neil pole sisseehitatud kergeid tekstitöötlusrutiine ja neid on raskem siluda.

Mis on CGI programmeerimiseks sobivaim keel? See, mida sa enda jaoks programmeerimise mõttes mugavamaks pead. Mõlemad on CGI-rakenduste programmeerimiseks võrdselt tõhusad ja korralike teekide korral on mõlemal sarnased võimalused. Kui sul on aga raskesti ligipääsetav server, võid kasutada väiksemaid kompileeritud C-programme.Kui pead kiiresti kirjutama palju tekstitöötlustööd nõudva rakenduse, võid kasutada hoopis Perli.

Hoiatused

CGI-rakendustele on mõned olulised alternatiivid. Paljud serverid sisaldavad nüüd API programmeerimist, mis muudab serveri otselaiendite programmeerimise lihtsamaks, mitte eraldiseisvatele CGI-rakendustele. API-serverid on tavaliselt tõhusamad kui CGI-programmid. Teised serverid sisaldavad sisseehitatud funktsioone, mis saavad hakkama spetsiaalsete mitte-CGI-elementidega, näiteks andmebaasi liidestega. Lõpuks saab mõnda rakendust renderdada mõne uue kliendipoolse (mitte serveripoolse) tehnoloogiaga, nagu Java. Kas CGI vananeb nii kiirete tehnoloogiamuutuste taustal kiiresti?

Ebatõenäoline. CGI-l on uuemate tehnoloogiate ees mitmeid eeliseid.

  • See on mitmekülgne ja kaasaskantav. Saate kirjutada CGI-rakenduse, kasutades peaaegu iga programmeerimiskeelt mis tahes platvormil. Mõned alternatiivid, näiteks serveri API, piiravad teid mõne keelega ja neid on palju raskem õppida.
  • On ebatõenäoline, et sellised klienditehnoloogiad nagu Java asendaksid CGI-d, kuna on mõned rakendused, mille jaoks serverirakendused sobivad palju paremini.
  • Paljud CGI piirangud on HTML- või HTTP-piirangud. Kuna Interneti standardid üldiselt arenevad, arenevad ka CGI võimalused.

Kokkuvõte

Ühine lüüs on protokoll, mille abil programmid suhtlevad veebiserveritega. CGI mitmekülgsus annab programmeerijatele võimaluse kirjutada lüüsiprogramme peaaegu igas keeles, kuigi erinevate keeltega on seotud palju kompromisse. Ilma selle võimaluseta oleks interaktiivsete veebilehtede loomine keeruline, parimal juhul oleks vaja serveri modifikatsioone ja interaktiivsus oleks enamikule kasutajatele, kes pole saidiadministraatorid, ligipääsmatu.

Peatükk 2. Põhitõed

Mitu aastat tagasi lõin Harvardi kolledži jaoks lehe, kuhu sain nende kohta oma kommentaare esitada. Tol ajal oli Internet noor ja dokumentatsioon napp. Mina, nagu paljud teised, toetusin CGI programmeerimise õppimisel kokkuvõtlikule dokumentatsioonile ja teiste loodud programmeerimissüsteemile. Kuigi see õppemeetod nõudis mõningast uurimistööd, palju katsetamist ja palju küsimusi, oli see väga tõhus. See peatükk on minu varase CGI-ga töötamise vili (muidugi koos mõne täpsustusega).

Ehkki üldise lüüsiliidese täielikuks mõistmiseks ja sellega valdamiseks kulub veidi aega, on protokoll ise üsna lihtne. Igaüks, kellel on mõned põhilised programmeerimisoskused ja tunneb veebi, saab kiiresti õppida programmeerima üsna keerulisi CGI-rakendusi täpselt nii, nagu mina ja teised seda paar aastat tagasi õppisin.

Selle peatüki eesmärk on esitada CGI põhitõed terviklikul, kuigi kokkuvõtlikul kujul. Iga siin käsitletud kontseptsiooni käsitletakse üksikasjalikult järgmistes peatükkides. Pärast selle peatüki läbimist saate aga kohe alustada CGI rakenduste programmeerimist. Kui olete sellele tasemele jõudnud, saate õppida CGI peensusi, lugedes ülejäänud raamatut või lihtsalt katsetades omal käel.

CGI programmeerimise saab koondada kahele ülesandele: teabe hankimine veebibrauserist ja teabe saatmine brauserisse. See on üsna intuitiivne, kui olete õppinud CGI-rakenduste tavapärase kasutamise. Sageli palutakse kasutajal täita vorm, näiteks sisestada oma nimi. Niipea kui kasutaja täidab vormi ja vajutab Enter, saadetakse see teave CGI programmi. Seejärel peab CGI programm selle teabe tõlkima, mida ta mõistab, seda asjakohaselt töötlema ja seejärel brauserisse tagasi saatma, olgu see siis lihtne kinnitus või otsingutulemus mitmeotstarbelises andmebaasis.

Teisisõnu nõuab CGI programmeerimine arusaamist, kuidas Interneti-brauserist sisendit vastu võtta ja väljundit tagasi saata. See, mis toimub CGI-programmi sisend- ja väljundfaasi vahel, sõltub arendaja eesmärgist. Leiate, et CGI programmeerimise peamine raskus seisneb selles vaheetapis; Kui olete õppinud sisendi ja väljundiga töötama, piisab sisuliselt sellest, et saada CGI arendajaks.

Selles peatükis saate teada CGI sisendi ja väljundi põhimõtted ning muud põhioskused, mis on vajalikud CGI kirjutamiseks ja kasutamiseks, sealhulgas näiteks HTML-vormide loomine ja CGI-programmide nimetamine. See peatükk hõlmab järgmisi teemasid:

  • Traditsiooniline programm "Tere, maailm!";
  • CGI väljund: saadab teavet tagasi Interneti-brauseris kuvamiseks;
  • Rakenduse konfigureerimine, installimine ja käitamine. Saate teada erinevate veebiplatvormide ja serverite kohta;
  • CGI sisend: veebibrauseri saadetud teabe tõlgendamine. Tutvumine mõne kasuliku programmeerimisteegiga sellise sisendi parsimiseks;
  • Lihtne näide: see hõlmab kõiki selle peatüki õppetükke;
  • Programmeerimisstrateegia.

Selle peatüki olemuse tõttu puudutan vaid mõnda teemat. Ära muretse; kõiki neid teemasid käsitletakse teistes peatükkides palju sügavamalt.

Tere, Maailm!

Alustate traditsioonilise sissejuhatava programmeerimisülesandega. Kirjutate programmi, mis kuvab "Tere, maailm!" oma veebibrauseris. Enne selle programmi kirjutamist peate mõistma, millist teavet veebibrauser CGI programmidelt saada ootab. Samuti peate teadma, kuidas seda programmi käivitada, et seda töös näha.

CGI on keelest sõltumatu, nii et saate seda programmi rakendada mis tahes keeles. Iga keele sõltumatuse demonstreerimiseks kasutatakse siin mitut erinevat keelt. Perlis on "Tere, maailm!" näidatud nimekirjas 2.1.

Loetelu 2.1. Tere, Maailm! Perlis. #! / usr / local / bin / perl # Hello.cgi – minu esimene CGI-programmi väljatrükk "Sisutüüp: tekst / html \ n \ n"; printida" \ n "; prindi" Tere, Maailm!"; printida"\ n "; prindi" \ n "; prindi"

Tere, Maailm!

\ n "; prindi" \ n ";

Salvestage see programm nimega hello.cgi ja installige see sobivasse kohta. (Kui te pole kindel, kus see asub, ärge muretsege, selle leiate selle peatüki hilisemast jaotisest "CGI-programmi installimine ja käitamine".) Enamiku serverite jaoks nimetatakse vajalikku kataloogi cgi- prügikast. Nüüd käivitage programm oma veebibrauserist. Enamiku jaoks tähendab see järgmise ühtse ressursiotsija (URL) avamist:

http://hostinimi/katalooginimi/hello.cgi

Hostinimi on teie veebiserveri nimi ja katalooginimi on kataloog, kuhu sisestate hello.cgi (tõenäoliselt cgi-bin).

Tere.cgi poolitamine

Hello.cgi puhul tasub tähele panna mõnda asja.

Esiteks kasutate lihtsaid printimiskäske. CGI-programmid ei vaja mingeid spetsiaalseid failideskriptoreid ega väljundkirjeldusi. Väljundi saatmiseks brauserisse printige lihtsalt stdout.

Teiseks pange tähele, et esimese trükiväljavõtte sisu (sisutüüp: tekst / html) ei ilmu teie veebibrauseris. Saate brauserisse tagasi saata mis tahes teavet, mida soovite (HTML-leht, graafika või heli), kuid kõigepealt peate brauserile ütlema, milliseid andmeid te saadate. See rida annab brauserile teada, millist teavet oodata – antud juhul HTML-lehte.

Kolmandaks, programmi nimi on hello.cgi. Te ei pea alati oma CGI-programmi nimega koos kasutama laiendit .cgi. Kuigi paljude keelte lähtekoodis kasutatakse ka laiendit .cgi, ei kasutata seda keele tüübi tähistamiseks, vaid see on viis, kuidas server tuvastab faili käivitatava failina, mitte graafilise failina, HTML-failina. või tekstifaili. Serverid on sageli konfigureeritud nii, et nad proovivad käivitada ainult neid faile, millel on see laiend, kuvades kõigi teiste failide sisu. Kuigi laienduse .cgi kasutamine on valikuline, peetakse seda siiski heaks tavaks.

Üldiselt on hello.cgi-l kaks põhiosa:

  • annab brauserile teada, millist teavet oodata (sisutüüp: tekst / html)
  • ütleb brauserile, mida kuvada (Tere, maailm!)

Tere, Maailm! C-s

CGI-programmide keelelise sõltumatuse illustreerimiseks näitab loend 2.2 C-keeles kirjutatud programmi hello.cgi ekvivalenti.

Loetelu 2.2. Tere, Maailm! keeles C. / * hello.cgi.c – Tere, maailm CGI * / #include int main () (printf ("Sisu tüüp: tekst / html \ r \ n \ r \ n"); printf (" \ n "); printf (" Tere, Maailm!\ n "); printf ("\ n "); printf (" \ n "); printf ("

Tere, Maailm!

\ n "); printf (" \ n ";)

Märge

Pange tähele, et hello.cgi Perli versioon kasutab sisutüüpi print ": text / html \ n \ n"; C-versioon kasutab printimist ("Sisutüüp: text / html \ r \ n \ r \ n");

Miks prindib Perl lause kahe reavahetusega (\ n), samas kui C printf lõpeb kahe reavahetuse ja reavahetusega (\ r \ n)?

Formaalselt peaksid päised (kõik väljundid enne tühja rida) olema eraldatud käru tagastusmärgi ja reavahetuse märgiga. Kahjuks tõlgib Perl DOS-i ja Windowsi masinates \ r erineva reavahetusena, mitte käru tagastamisena.

Kuigi Perli erand on tehniliselt vale, töötab see peaaegu kõigis protokollides ja seda kasutatakse ka kõigil platvormidel. Seetõttu kasutan kõigis selle raamatu Perli näidetes reavahetusi, eraldades päiseid, mitte reavahetust ja reavahetust.

Selle probleemi sobiv lahendus on esitatud 4. peatükis, Järeldus.

Ei veebiserverit ega brauserit ei huvita, mis keeles programmi kirjutatakse. Kuigi igal keelel on CGI programmeerimiskeelena oma eelised ja puudused, on kõige parem kasutada seda keelt, mis teile sobib. (Programmeerimiskeele valikust on täpsemalt juttu 1. peatükis "Ühislüüsiliides (CGI)").

CGI tuletamine

Nüüd saate lähemalt vaadata veebibrauserisse teabe saatmise probleemi. Näites Tere, maailm! näete, et veebibrauserid ootavad kahte andmekogumit: päist, mis sisaldab teavet, näiteks seda, millist teavet kuvada (nt sisutüüp: rida) ja tegelikku teavet (mida veebibrauseris kuvatakse). ). Need kaks teabeplokki on eraldatud tühja reaga.

Päist nimetatakse HTTP päiseks. See annab olulist teavet teabe kohta, mida brauser hakkab saama. HTTP-päiseid on mitut erinevat tüüpi ja kõige mitmekülgsem on see, mida varem kasutasite: sisutüüp: päis. Saate kasutada erinevaid HTTP-päiste kombinatsioone, eraldades need käru tagastus- ja reavahetusmärkidega (\ r \ n). Päist andmetest eraldav tühi rida koosneb ka reavahetusest ja reavahetusest (miks on mõlemat vaja, on lühidalt kirjeldatud eelmises märkuses ja täpsemalt 4. peatükis). Teiste HTTP-päiste kohta saate teada 4. peatükist; töötate praegu päise Content-Type: kallal.

Sisutüüp: päis kirjeldab, millist tüüpi andmeid CGI tagastab. Selle päise sobiv vorming on:

Sisutüüp: alamtüüp / tüüp

Kui alamtüüp / tüüp on õige mitmeotstarbeliste Interneti-posti laiendite (MIME) tüüp. Kõige tavalisem MIME tüüp on HTML: text / html. Tabelis 2.1 on loetletud mõned levinumad MIME-tüübid, mida arutatakse; MIME tüüpide täielikum loetelu ja analüüs on toodud 4. peatükis.

Märge

MIME leiutati algselt kirjade sisu kirjeldamiseks. Sellest on saanud üsna tavaline sisutüübi teabe esitamise viis. MIME kohta saate rohkem lugeda RFC1521-st. Internetis leiduvad RFC-d tähistavad "Requests for Comment", mis on kokkuvõtted otsustest, mille on teinud Internetis standardeid kehtestada üritavad grupid. RFC1521 tulemusi saab vaadata järgmiselt URL-ilt: http://andrew2.andrew.cmu.edu/rfc/rfc1521.html

Tabel 2.1. Mõned levinumad MIME-tüübid. MIME tüüp Kirjeldus Tekst / html Hüperteksti märgistuskeel (HTML) Tekst / lihtteksti failid Pilt / gif Graafikafailid GIF Pilt / jpeg Tihendatud graafikafailid JPEG Audio / põhilised Suni helifailid * .au Audio / x-wav Windows *. wav

Pärast pealkirja ja tühja rida printige andmed lihtsalt vajalikul kujul. Kui saadate HTML-i, printige HTML-sildid ja andmed päise järel stdout-i. Samuti saate saata graafikat, heli ja muid kahendfaile, printides faili sisu lihtsalt stdout-i. Mõned näited selle kohta on toodud 4. peatükis.

CGI programmi installimine ja käivitamine

See jaotis erineb mõnevõrra CGI programmeerimisest ja räägib teie veebiserveri konfigureerimisest CGI-d kasutama, programmide installimisest ja käivitamisest. Tutvud erinevate serveritega erinevatele platvormidele enam-vähem detailselt, kuid parima variandi leidmiseks pead oma serveri dokumentatsiooni põhjalikumalt uurima.

Kõik serverid vajavad ruumi serverifailide jaoks ja ruumi HTML-dokumentide jaoks. Selles raamatus nimetatakse serveriala nimeks ServerRoot ja dokumendiala nimeks Dokumendijuur. UNIX-seadmetes asub ServerRoot tavaliselt kaustas / usr / local / etc / httpd / ja DocumentRoot on tavaliselt kaustas / usr / local / etc / httpd / htdocs /. Kuid see ei mõjuta teie süsteemi, seega asendage kõik viited ServerRootile ja DocumentRootile oma ServerRooti ja DocumentRootiga.

Kui pääsete failidele juurde veebibrauseri abil, määrate faili URL-is, mis on seotud DocumentRootiga. Näiteks kui teie serveri aadress on mymachine.org, siis viitate sellele failile järgmise URL-iga: http://mymachine.org/index.html

Serveri konfiguratsioon CGI jaoks

Enamik veebiservereid on CGI-programmide kasutamiseks eelkonfigureeritud. Tavaliselt näitavad serverile kaks parameetrit, kas fail on CGI-rakendus või mitte:

  • Määratud kataloog. Mõned serverid võimaldavad teil määrata, et kõik failid määratud kataloogis (vaikimisi nimetatakse seda tavaliselt cgi-biniks) on CGI.
  • Failinime laiendid. Paljud serverid on eelkonfigureeritud määratlema kõik cgi-lõpulised failid CGI-na.

Määratud kataloogi meetod on mõnevõrra mineviku jäänuk (väga varased serverid kasutasid seda ainsa meetodina, et määrata, millised failid olid CGI-programmid), kuid sellel on mitmeid eeliseid.

  • See hoiab CGI-programmid tsentraliseerituna, vältides teiste kataloogide segamist.
  • Te ei ole piiratud ühegi konkreetse failinime laiendiga, nii et saate failidele nime anda, mida iganes soovite. Mõned serverid võimaldavad teil määrata mitu erinevat kataloogi CGI kataloogideks.
  • See annab teile ka suurema kontrolli selle üle, kes saab CGI-d salvestada. Näiteks kui teil on server ja haldate mitme kasutajaga süsteemi ega soovi, et nad kasutaksid oma CGI-skripte ilma programmi esmalt turvakaalutlustel üle vaatamata, saate määrata CGI-ks ainult need failid, mis asuvad piiratud tsentraliseeritud kataloogis. Seejärel peavad kasutajad andma teile installimiseks CGI-programmi ja saate esmalt koodi üle vaadata, et veenduda, et programmil pole olulisi turbeprobleeme.

CGI-märkimine failinime laiendi kaudu võib selle paindlikkuse tõttu olla kasulik. Te ei piirdu ühe CGI-programmide kataloogiga. Enamikku servereid saab konfigureerida CGI-d ära tundma failinime laienduse kaudu, kuigi kõik pole vaikimisi sel viisil konfigureeritud.

Hoiatus

Pidage meeles turvakaalutluste tähtsust serveri konfigureerimisel CGI jaoks. Siin käsitletakse mõnda näpunäidet ja 9. peatükis "CGI turvamine" käsitletakse neid aspekte üksikasjalikumalt.

CGI installimine UNIX-i serveritesse

Olenemata sellest, kuidas teie UNIX-server on konfigureeritud, tuleb teha mitmeid samme, et tagada teie CGI-rakenduste ootuspärane töö. Teie veebiserver töötab tavaliselt olematu kasutajana (st UNIX-i kasutaja nobody on konto, millel pole failile juurdepääsu luba ja mida ei saa registreerida). CGI-skriptid (kirjutatud Perlis, Bourne'i shellis või mõnes muus skriptikeeles) peavad olema ülemaailmsed, käivitatavad ja loetavad.

viip

Failide loetavaks ja käivitatavaks muutmiseks kogu maailmas kasutage järgmisi UNIX-i käsuõigusi: chmod 755 failinimi.

Kui kasutate skriptikeelt (nt Perl või Tcl), lisage skripti esimesele reale tõlgi täielik tee. Näiteks Perli skript, mis kasutab perli kataloogis / usr / local / bin, peab algama järgmise reaga:

#! / usr / local / bin / perl

Hoiatus

Ärge kunagi pange interpretaatorit (perl või Tcl Wish binaarfaili / cgi-bin. See kujutab teie süsteemile turvariski. Üksikasju vaadake peatükist 9).

Mõned üldised UNIX-i serverid

NCSA ja Apache serveritel on sarnased konfiguratsioonifailid, kuna Apache põhines algselt NCSA koodil. Vaikimisi on need konfigureeritud nii, et kõik failid cgi-bin kataloogis (mis asub vaikimisi ServerRootis) on CGI-programmid. Kataloogi cgi-bin asukoha muutmiseks saate redigeerida konfiguratsioonifaili conf / srm.conf. Selle kataloogi konfigureerimise vorming on

ScriptAlias ​​​​fakedirectoryname reaalkatalooginimi

kus fakedirectoryname on kataloogi pseudonimi (/ cgi-bin) ja real directoryname on täielik tee, kuhu CGI-programmid tegelikult salvestatakse. Saate konfigureerida rohkem kui ühe ScriptAlias'e, lisades rohkem ScriptAlias'e ridu.

Vaikekonfiguratsioon on enamiku kasutajate vajaduste jaoks piisav. Õige reaalkatalooginime määramiseks peate failis srm.conf seda rida muutma. Kui teie CGI programmid asuvad näiteks kaustas / usr / local / etc / httpd / cgi-bin, peaks teie faili srm.conf rida ScriptAlias ​​välja nägema järgmine:

ScriptAlias ​​/ cgi-bin / / usr / local / etc / httpd / cgi-bin /

Järgmist URL-i kasutatakse selles kataloogis asuvatele CGI-programmidele juurdepääsuks või linkimiseks:

Http: // hostinimi / cgi-bin / programminimi

Kus hostinimi on teie veebiserveri hostinimi ja programminimi teie CGI nimi.

Oletame näiteks, et kopeerisite programmi hello.cgi oma veebiserveri nimega www.company.com oma cgi-bin kataloogi (näiteks / usr / local / etc / httpd / cgi-bin). CGI-le juurdepääsuks kasutage järgmist URL-i: http://www.company.com/cgi-bin/hello.cgi

Kui soovite konfigureerida oma NCSA- või Apache-serverit tuvastama mis tahes .cgi-faili CGI-na, peate redigeerima kahte konfiguratsioonifaili. Esiteks jätke failis srm.conf järgmine rida kommenteerimata:

AddType rakendus / x-httpd-cgi .cgi

See seob MIME tüüpi CGI laiendiga .cgi. Nüüd peate muutma faili access.conf, et saaksite CGI-d käivitada mis tahes kataloogis. Selleks lisage ExecCGI valik reale Option. See näeb välja umbes nagu järgmine rida:

Valikute indeksid FollowSymLinks ExecCGI

Nüüd peetakse iga .cgi-laiendiga faili CGI-ks; pääsete sellele juurde samamoodi nagu mis tahes failile oma serveris.

CERN-i server on konfigureeritud samamoodi nagu Apache ja NCSA serverid. ScriptAliase asemel kasutab CERN-i server käsku Exec. Näiteks failis httpd.conf näete järgmist rida:

Exec / cgi-bin / * / usr / local / etc / httpd / cgi-bin / *

Teisi UNIX-servereid saab konfigureerida samal viisil; lisateabe saamiseks vaadake serveri dokumentatsiooni.

CGI installimine Windowsi

Enamik Windows 3.1, Windows 95 ja Windows NT jaoks saadaolevatest serveritest on konfigureeritud CGI tuvastamiseks failinime laiendusmeetodiga. Üldiselt nõuab Windowsi-põhise serveri konfiguratsiooni muutmine lihtsalt serveri konfiguratsiooniprogrammi käivitamist ja vastavate muudatuste tegemist.

Serveri seadistamine skripti (nt Perli) käivitamiseks on mõnikord keeruline. DOS-is või Windowsis ei saa te skripti esimesel real tõlgendajat määratleda, nagu UNIX-i puhul. Mõned serverid on eelkonfigureeritud seostama tõlgiga teatud failinimelaiendeid. Näiteks eeldavad paljud Windowsi veebiserverid, et .pl-lõpulised failid on Perli skriptid.

Kui server seda tüüpi failide seostamist ei teosta, saate määrata ümbrise pakkfaili, mis kutsub välja nii tõlgi kui ka skripti. Nagu UNIX-serveri puhul, ärge installige interpretaatorit cgi-bini kataloogi ega mõnda veebijuurdepääsetavasse kataloogi.

CGI installimine Macintoshisse

Kaks kõige tuntumat serverivalikut Macintoshi jaoks on WebStar StarNine ja selle eelkäija MacHTTP. Mõlemad tunnevad CGI ära failinime laiendi järgi.

MacHTTP mõistab kahte erinevat laiendit: .cgi ja .acgi, mis tähistab asünkroonset CGI-d. Tavalised Macintoshisse installitud CGI-programmid (.cgi-laiendiga) hoiavad veebiserveri hõivatud kuni CGI-ga lõppemiseni, sundides serverit kõik muud päringud peatama. Asünkroonne CGI seevastu võimaldab serveril taotlusi vastu võtta isegi siis, kui see töötab.

Macintoshi CGI arendaja, kes kasutab mõnda neist veebiserveritest, peaks võimalusel kasutama lihtsalt .cgi laiendi asemel .acgi laiendit. See peaks töötama enamiku CGI programmidega; kui see ei tööta, nimetage programm ümber .cgi-ks.

CGI täitmine

Kui olete CGI installinud, on selle saavutamiseks mitu võimalust. Kui teie ainult väljundina töötav CGI-programm on nagu programm Hello, World!, saate selle käivitada lihtsalt selle URL-i kaudu.

Enamik programme töötab HTML-vormi serveripoolse rakendusena. Enne kui õpite nendest vormidest teavet hankima, lugege esmalt lühike sissejuhatus selliste vormide loomise kohta.

Kiire õpetus HTML-vormide kohta

Kaks kõige olulisemat silti HTML-vormingus on sildid ja ... Enamiku HTML-vorme saate luua ainult nende kahe sildi abil. Selles peatükis uurite neid silte ja väikest võimalike tüüpide või atribuutide alamhulka. ... Täieliku õpetuse ja HTML-vormide viite saamiseks vaadake 3. peatükki HTML ja vormid.

Tag

Tag kasutatakse selleks, et määrata, millist HTML-faili osa tuleks kasutaja sisestatud teabe jaoks kasutada. See viitab sellele, kuidas enamik HTML-lehti CGI-programmi kutsuvad. Sildi atribuudid määravad programmi nime ja asukoha kas kohalikult või täieliku URL-ina, kasutatava kodeeringu tüübi ja programmis kasutatava andmete teisaldamise meetodi.

Järgmine rida näitab sildi spetsifikatsioone :

< ACTION FORM = "url" METHOD = ENCTYPE = "..." >

Atribuut ENCTYPE ei mängi erilist rolli ja seda tavaliselt sildiga ei kaasata ... Üksikasjad sildi ENCTYPE kohta on toodud 3. peatükis. Üks võimalus ENCTYPE-i kasutamiseks on näidatud 14. peatükis "Omatud laiendused".

Atribuut ACTION viitab CGI programmi URL-ile. Pärast seda, kui kasutaja on vormi täitnud ja teabe edastanud, kodeeritakse kogu teave ja edastatakse CGI programmi. CGI programm ise lahendab teabe dekodeerimise ja töötlemise küsimuse; seda käsitletakse selle peatüki hilisemas osas jaotises „Brauserisisendi vastuvõtmine”.

Lõpuks kirjeldab atribuut METHOD, kuidas CGI programm peaks sisendi vastu võtma. Need kaks meetodit – GET ja POST – erinevad CGI-programmi teabe edastamise poolest. Mõlemat käsitletakse jaotises "Brauserist sisendi vastuvõtmine".

Selleks, et brauser saaks kasutaja sisestada, peavad kõik vormisildid ja teave olema ümbritsetud sildiga ... Ärge unustage viimast silti

vormi lõpu märkimiseks. Vormi sees ei saa olla, kuigi saate seadistada vormi, mis võimaldab teil esitada teavet erinevates kohtades; seda aspekti käsitletakse põhjalikult 3. peatükis.

Tag

Märgendi abil saate luua tekstisisestusribasid, raadionuppe, märkeruutusid ja muid viise sisendi vastuvõtmiseks ... See jaotis hõlmab ainult tekstisisestusvälju. Selle välja rakendamiseks kasutage silti järgmiste atribuutidega:

< INPUT TYPE=text NAME = "... " VALUE = "... " SIZE = MAXLENGTH = >

NAME on muutuja sümboolne nimi, mis sisaldab kasutaja sisestatud väärtust. Kui lisate teksti atribuudile VALUE, paigutatakse see tekst tekstisisestusväljale vaikimisi. Atribuut SIZE võimaldab määrata sisestusvälja horisontaalse pikkuse nii, nagu see brauseriaknas kuvatakse. Lõpuks määrab MAXLENGTH maksimaalse märkide arvu, mille kasutaja saab väljale sisestada. Pange tähele, et atribuudid VALUE, SIZE, MAXLENGTH on valikulised.

Vormi esitamine

Kui vormi sees on ainult üks tekstiväli, saab kasutaja vormi esitada, tippides lihtsalt klaviatuuril teabe ja vajutades sisestusklahvi. Vastasel juhul peab kasutajal teabe esitamiseks olema mõni muu viis. Kasutaja esitab teabe järgmise sildiga esitamiseks nupu abil:

< Input type=submit >

See silt loob teie vormi sisse nupu Esita. Kui kasutaja on vormi täitmise lõpetanud, saab ta selle sisu esitada vormi atribuudi ACTION poolt määratud URL-ile, klõpsates nuppu Esita.

Brauseri sisendi aktsepteerimine

Eespool olid näited CGI-programmi kirjutamisest, mis saadab teavet serverist brauserisse. Tegelikkuses pole CGI programmil, mis ainult andmeid väljastab, palju rakendusi (mõned näited on toodud 4. peatükis). CGI olulisem võimalus on hankida teavet brauserist – funktsioon, mis muudab veebi interaktiivseks.

CGI programm saab brauserist kahte tüüpi teavet.

  • Esiteks saab see erinevat teavet brauseri (selle tüüp, mida ta saab vaadata, hosti host ja nii edasi), serveri (selle nimi ja versioon, täitmisport jne) ja otse brauseri kohta. CGI programm (programmi nimi ja asukoht). Server annab kogu selle teabe keskkonnamuutujate kaudu CGI programmile.
  • Teiseks saab CGI programm vastu võtta kasutaja sisestatud teavet. See teave saadetakse pärast seda, kui brauser on selle kodeerinud, kas keskkonnamuutuja (GET-meetod) või standardsisendi (stdin-POST meetod) kaudu.

Keskkonnamuutujad

Kasulik on teada, millised keskkonnamuutujad on CGI programmi jaoks saadaval nii treeningu ajal kui ka silumiseks. Tabelis 2.2 on loetletud mõned saadaolevad CGI keskkonnamuutujad. Samuti saate kirjutada CGI-programmi, mis väljastab veebibrauserisse keskkonnamuutujad ja nende väärtused.

Tabel 2.2. Mõned olulised CGI keskkonnamuutujad Keskkonnamuutuja Eesmärk REMOTE_ADDR Klientmasina IP-aadress. REMOTE_HOST Kliendi masina host. HTTP _ACCEPT Loetleb MIME andmetüübid, mida brauser saab tõlgendada. HTTP _USER_AGENT Brauseri teave (brauseri tüüp, versiooni number, operatsioonisüsteem jne). REQUEST_METHOD HANGI või POSTITA. CONTENT_LENGTH Sisendi suurus, kui see saadetakse POST-iga. Kui sisendit pole või kasutatakse GET-meetodit, on see parameeter määratlemata. QUERY_STRING Sisaldab teavet, mis tuleb sisestada, kui see edastatakse GET-meetodiga. PATH_INFO Võimaldab kasutajal määrata tee CGI käsurealt (näiteks http: // hostinimi / cgi-bin / programminimi / tee). PATH_TRANSLATED Tõlgib PATH_INFO suhtelise tee süsteemi tegelikuks teeks.

Keskkonnamuutujaid kuvava CGI-rakenduse kirjutamiseks peate teadma, kuidas teha kahte asja.

  • Määratlege kõik keskkonnamuutujad ja neile vastavad väärtused.
  • Kuva brauseri tulemused.

Sa juba tead, kuidas viimast toimingut teha. Perlis salvestatakse keskkonnamuutujad % ENV assotsiatiivsesse massiivi, mis sisestatakse keskkonnamuutuja nime järgi. Nimekiri 2.3 sisaldab env.cgi, Perli programmi, mis täidab meie eesmärki.

Loetelu 2.3. Perli programm env.cgi, mis prindib välja kõik CGI keskkonnamuutujad.

#! / usr / local / bin / perl print "Sisutüüp: tekst / html \ n \ n"; printida" \ n "; prindi" CGI keskkond\ n "; prindi"\ n "; prindi" \ n "; prindi"

CGI keskkond

\ n "; foreach $ env_var (keys% ENV) (print" $ env_var= $ ENV ($ env_var)
\ n ";) print" \ n ";

Sarnase programmi võiks kirjutada ka C keeles; täielik kood on loendis 2.4.

Nimekiri 2.4. Env.cgi.c-st C. / * env.cgi.c * / #include extern char ** keskkond; int main () (char ** p = keskkond; printf ("Sisu tüüp: tekst / html \ r \ n \ r \ n"); printf (" \ n "); printf (" CGI keskkond\ n "); printf ("\ n "); printf (" \ n "); printf ("

CGI keskkond

\ n "); while (* p! = NULL) printf ("% s
\ n ", * p ++); printf (" \ n ";)

SAADA või POSTITA?

Mis vahe on GET- ja POST-meetoditel? GET edastab kodeeritud sisendstringi keskkonnamuutuja QUERY_STRING kaudu, POST aga stdini kaudu. Eelistatud meetod on POST, eriti suure andmemahuga vormide puhul, sest saadetava info mahule pole piiranguid ning GET meetodi puhul on keskkonna ruumi hulk piiratud. GET-il on siiski teatud kasulik omadus; seda käsitletakse üksikasjalikult 5. peatükis sisend.

Kasutatava meetodi määramiseks uurib CGI programm keskkonnamuutujat REQUEST_METHOD, mille väärtuseks määratakse kas GET või POST. Kui see on määratud väärtusele POST, salvestatakse kodeeritud teabe pikkus keskkonnamuutujasse CONTENT_LENGTH.

Kodeeritud sisend

Kui kasutaja vormi esitab, kodeerib brauser teabe esmalt enne serverisse ja seejärel CGI-rakendusse saatmist. Kui kasutate silti , omistatakse igale väljale sümboolne nimi. Kasutaja sisestatud väärtust esitatakse muutuja väärtusena.

Selle kindlaksmääramiseks kasutab brauser URL-i kodeeringu spetsifikatsiooni, mida saab kirjeldada järgmiselt:

  • Eraldab erinevad väljad ampersandiga (&).
  • Eraldab nime ja väärtused võrdusmärkidega (=), kusjuures nimi on vasakul ja väärtus paremal.
  • Asendab tühikud plussmärkidega (+).
  • Asendab kõik "ebanormaalsed" märgid protsendimärgiga (%), millele järgneb kahekohaline kuueteistkümnendkoodi kood.

Teie lõplik kodeeritud string näeb välja järgmine:

Nimi1 = väärtus1 & nimi2 = väärtus2 & nimi3 = väärtus3 ...

Märkus. URL-i kodeerimise spetsifikatsioonid on standardis RFC1738.

Oletagem näiteks, et teil on vorm, mis küsis nime ja vanust. Selle vormi renderdamiseks kasutatud HTML-kood on näidatud loendis 2.5.

Nimekiri 2.5. HTML-kood nime ja vanusevormi kuvamiseks.

Nimi ja vanus

Sisestage oma nimi:

Sisesta oma vanus:

Oletame, et kasutaja sisestab nimeväljale Joe Schmoe ja vanuseväljale 20. Sisend kodeeritakse sisendstringi.

Nimi = Joe + Schmoe ja vanus = 20

Sisestuse parsimine

Et see teave oleks kasulik, peate seda teavet kasutama millegi jaoks, mida teie CGI-programmid saavad kasutada. Sisestuse sõelumise strateegiaid käsitletakse 5. peatükis. Praktikas ei pea te kunagi mõtlema, kuidas sisendit sõeluda, sest mitmed eksperdid on juba kirjutanud avalikult kättesaadavad parsimist teostavad teegid. Kaks sellist teeki on selles peatükis esitatud järgmistes jaotistes: cgi -lib.pl Perli jaoks (kirjutanud Steve Brenner) ja cgihtml C jaoks (kirjutanud mina).

Enamiku erinevates keeltes kirjutatud teekide ühine eesmärk on kodeeritud stringi sõelumine ning nimede ja väärtuste paaride andmestruktuuri panemine. Sisseehitatud andmestruktuuridega keele (nt Perl) kasutamisel on selge eelis; enamik madalama taseme keelte (nt C ja C ++) teeke sisaldavad aga andmestruktuuri ja alamprogrammi täitmist.

Ei ole vaja saavutada täielikku arusaamist raamatukogudest; palju olulisem on õppida neid kasutama CGI programmeerija töö lihtsustamise vahendina.

Cgi -lib.pl

Cgi -lib.pl kasutab Perli assotsiatiivseid massiive. Funktsioon & ReadParse analüüsib sisendstringi ja sisestab iga nime/väärtuse paari nime järgi. Näiteks vastavad Perli stringid, mis on vajalikud just esitatud sisendstringi nime / vanuse dekodeerimiseks

& ReadParse (* sisend);

Nüüd, et näha "name" sisestatud väärtust, võite viidata assotsiatiivsele massiivile $ sisendile ("nimi"). Samuti vaadake "vanuse" väärtusele juurdepääsu muutuja $ sisendit ("vanus").

Cgihtml

C-l pole sisseehitatud andmestruktuure, seega rakendab cgihtml oma CGI-parsimisrutiinidega kasutamiseks oma seoste loendi. See määratleb kirjetüübi struktuuri järgmiselt:

Typedef struct (Char * nimi; Char * väärtus;) Kirjetüüp;

Sisestusstringi "nimi / vanus" C-s cgihtml-i abil sõelumiseks kasutage järgmist:

/ * deklareerida lingitud loend nimega sisend * / Llist sisend; / * parsi sisend ja aseta lingitud loendisse * / read_cgi_input (& input);

Vanuse teabele juurdepääsu saamiseks saate loendit käsitsi sõeluda või kasutada olemasolevat funktsiooni cgi _val ().

#kaasa #kaasa Char * vanus = malloc (sizeof (char) * strlen (cgi _val (sisend, "vanus")) + 1); Strcpy (vanus, cgi _val (sisend, "vanus"));

Väärtus "vanus" on nüüd salvestatud vanuse reale.

Märkus. Lihtsa massiivi (nt char age;) kasutamise asemel eraldan dünaamiliselt mäluruumi vanusestringi jaoks. Kuigi see muudab programmeerimise keeruliseks, on see turvalisuse seisukohast siiski oluline. Sellest on täpsemalt juttu 9. peatükis.

Lihtne CGI programm

Olete kirjutamas CGI-programmi nimega nameage.cgi, mis töötleb nime/vanuse vormi. Andmetöötlus (mida ma tavaliselt nimetan "vahepealseks") on minimaalne. Nameage.cgi dekodeerib lihtsalt sisendi ning kuvab kasutajanime ja vanuse. Kuigi see tööriist pole eriti kasulik, näitab see CGI programmeerimise kõige kriitilisemat aspekti: sisend ja väljund.

Kasutate ülalkirjeldatud vormi, helistades nime ja vanuse väljadele. Ärge veel muretsege vastupidavuse ja tõhususe pärast; lahendada olemasolev probleem kõige lihtsamal viisil. Perli ja C lahendused on näidatud vastavalt loendites 2.6 ja 2.7.

Nimekiri 2.6. Nameage.cgi Perlis

#! / usr / local / bin / perl # nameage.cgi nõuab "cgi-lib.pl" & ReadParse (* sisend); printida "Sisutüüp: tekst / html \ r \ n \ r \ n"; printida" \ n "; prindi" Nimi ja vanus\ n "; prindi"\ n "; prindi" \ n "; print" Tere, ". $ sisend (" nimi ").". Olete \ n "; prindi $ sisend (" vanus ")." Aastaid vana.

\ n "; prindi" \ n ";

Nimekiri 2.7. nameage.cgi keeles C

/ * nameage.cgi.c * / #include #include "cgi-lib.h" int main () (listisisend; read_cgi_input (& input); printf ("Sisutüüp: tekst / html \ r \ n \ r \ n"); printf (" \ n "); printf (" Nimi ja vanus\ n "); printf ("\ n "); printf (" \ n "); printf (" Tere,% s. Olete \ n ", cgi_val (sisend," nimi ")); printf ("% s aastat vana.

\ n ", cgi_val (sisend," vanus ")); printf (" \ n ";)

Pange tähele, et need kaks programmi on peaaegu samaväärsed. Mõlemad sisaldavad sõelumisrutiine, mis võtavad ainult ühe rea ja töötlevad kogu sisendi (tänu nende vastavatele teegirutiinidele). Väljund on sisuliselt teie põhiprogrammi Hello, World! muudetud versioon.

Proovige programmi käivitada, täites vormi ja klõpsates nuppu Esita.

Üldine programmeerimisstrateegia

Nüüd teate kõiki CGI programmeerimiseks vajalikke põhiprintsiipe. Kui olete aru saanud, kuidas CGI teavet saab ja kuidas see brauserisse tagasi saadab, sõltub teie lõpptoote tegelik kvaliteet teie üldisest programmeerimisvõimest. Nimelt, kui programmeerite CGI-d (või midagi muud), pidage meeles järgmisi omadusi:

  • Lihtsus
  • Tõhusus
  • Mitmekülgsus

Esimesed kaks omadust on üsna tavalised: proovige muuta oma kood võimalikult loetavaks ja tõhusaks. Mitmekülgsus kehtib rohkem CGI-programmide kui muude rakenduste puhul. Kui hakkate oma CGI-programme välja töötama, märkate, et on mitmeid põhirakendusi, mida kõik teha tahavad. Näiteks CGI-programmi üks levinumaid ja ilmsemaid ülesandeid on vormi töötlemine ja tulemuste meili saatmine konkreetsele adressaadile. Teil võib olla mitu eraldi töödeldud vormi, millest igaühel on erinev adressaat. Selle asemel, et kirjutada iga vormi jaoks eraldi CGI-programm, saate säästa aega, kirjutades üldisema CGI-programmi, mis töötab kõigi vormide jaoks.

Olles käsitlenud kõiki CGI põhiaspekte, olen andnud teile piisavalt teavet, et alustada CGI programmeerimisega. Kuid selleks, et saada tõhusaks CGI arendajaks, peab teil olema sügavam arusaam sellest, kuidas CGI suhtleb serveri ja brauseriga. Selle raamatu ülejäänud osas käsitletakse üksikasjalikult selles peatükis möödaminnes mainitud probleeme, samuti rakenduste arendusstrateegiat, protokolli eeliseid ja piiranguid.

Kokkuvõte

Selles peatükis on lühidalt käsitletud CGI programmeerimise põhitõdesid. Loote väljundi, vormindades oma andmed õigesti ja printides stdout-vormingusse. CGI-sisendi hankimine on mõnevõrra keerulisem, kuna see tuleb enne kasutamist sõeluda. Õnneks on seal juba mitu teeki, mis parsivad.

Nüüdseks peaksite olema CGI-rakenduste programmeerimine üsna mugav. Ülejäänud osa sellest raamatust on pühendatud täpsemale spetsifikatsioonile, näpunäidetele ja programmeerimisstrateegiale keerukamate ja keerukamate rakenduste jaoks.

1. lehekülg 30-st

Tänapäeval on sellised asjad nagu külalisteraamat, serveriotsing ja sõnumite saatmise vorm peaaegu iga tõsise saidi oluline atribuut. Nende ja teiste kellade ja vilede tutvustamise probleem erutab muidugi algaja veebimeistri kujutlusvõimet igati, jättes une, söögiisu ja õllehimu ära. Kahjuks ei anna konkurentide lehtede HTML-i allikate uurimine muud kui linke teatud "cgi-binile" ja isegi uudistegruppides kohtab mõnikord mõne cgi-skripti mainimist. See artikkel on pühendatud nende samade cgi-skriptide kasutamise põhitõdedele teie saidi hiilguse ja õitsengu jaoks.

Alustuseks arvan, et peame mõistma mõisteid. CGI-skript on programm, mis töötab veebiserveris kliendi (st veebisaidi külastaja) nõudmisel. See programm ei erine põhimõtteliselt tavapärastest arvutisse installitavatest programmidest – olgu selleks siis MS Word või Quake mäng. CGI ei ole programmeerimiskeel, milles skript on kirjutatud, vaid Common Gateway Interface – spetsiaalne liides, mille kaudu skript käivitatakse ja sellega suheldakse.

Lühike lüüriline kõrvalepõige CGI-st

Mis siis on CGI- skriptid jms asjad üldiselt. Alustame sellest, et teie brauser (kui sisestasite URL) loob ühenduse protokolli kasutades HTTP määratud serveriga ja küsib temalt vajalikku faili, umbes selline:

GET /~paaa/cgi-bin/guestbbok.cgi HTTP / 1.0-See on taotluses kõige olulisem

Noh, kui küsitakse näiteks lihtsat faili .html siis kui selline fail on olemas, saadab server brauserile vastuse:

HTTP / 1.0 200 Olgu
Sisu tüüp: tekst / html

Edasi pärast tühja rida (seda on vaja eraldamiseks pealkiri alates keha) pärineb teave väga URL"a ...
See on põhimõtteliselt kogu Www.... minge lingilt lingile ....
Ja mis siis, kui teil on vaja midagi sellesse igavasse protsessi tuua päriselt interaktiivne, dünaamiline, ilus ja uhke ....? Noh, sellele küsimusele on vastus. Mis siis, kui nõutakse URL määrake eriprogramm ( CGI, programm Ühine lüüsi liides - Ühine lüüsi liides) ja see, et see programm annab sulle midagi ja saadab selle brauserisse .... Server käivitub .cgi programm ja see näiteks pärast vormiandmete töötlemist sisestab teid kuhugi oma andmebaasi ja ütleb teile, et sa oled imeline :)
Noh, ma loodan, et ma huvitasin teid ......?

Lühike teave selle kohta, mida peate kirjutamiseks teadma CGI skriptid: Noh, kõigepealt peate teadma, mis on Internet ja kuidas see töötab (kas tead? ;))) ) Noh, natuke programmeerimisoskust (see on kõige tähtsam)
Kirjutame koos mõne lihtsa stsenaariumi ja siis ma ütlen teile, kus koer siin ringi tuhises ...
Kõigepealt looge oma kodukataloogis kataloog cgi-bin:

cd public_html
mkdir cgi-bin
chmod 0777 cgi-bin

Viimane rida on väga oluline.
Võtke redaktor ja tippige: #! / usr / bin / perl
# esimene.cgi
print "Sisutüüp: tekst / html \ n \ n";
printida" ";
printida"

tere teile!!!

";
print "";

Salvestage see kataloogi cgi-bin nime all esimene.cgi Kuidas sa selle päästsid?
Nüüd muutke see käivitatavaks (see on programm):

chmod + x first.cgi

Noh, jõuame piduliku hetkeni .... tippige brauseri reale http://www.uic.nnov.ru/~your_login/cgi-bin/first.cgi
ja vaata mis saab. On üks kahest asjast või skript töötab ja näete selle loodud lehte (palju õnne, see on jõudnud meie rügementi!) Või Serveri sisemine viga-siis ärge heituge, tegite midagi valesti. Kirpupüüdmise juhend tuleb siis kasuks. Esiteks saab süntaksikontrolli teha järgmiselt:

perl -c esimene.cgi

Perl annab teile kohe kas veateate (noh, see juhtub, semikoolon jäi vahele, sulud või jutumärgid unustati sulgeda ...) seda saab kohe parandada.
Loogiliselt jämedam on vahele jätta tühja rea ​​väljund, mis eraldab päise kehast:
print "Sisutüüp: tekst / html \ n \ n"; # Hästi
print "Sisutüüp: tekst / html \ n"; #VIGA!!!

Analüüsime skripti:
Esimene rida #! / usr / bin / perl Lihtsalt näitab, kus Perl süsteemis asub. Teine on lihtsalt kommentaar – märgi taha võib torkida mida iganes #
Siis tuleb print "Sisutüüp: tekst / html \ n \ n"; See on päis, mis näitab sisu tüüpi. Kõik, mis skript prindib oma standardsele STDOUT-väljundile, läheb serverisse töötlemiseks. Tühi rida eraldab pealkirja kehast, mis meie puhul on

tere teile!!!



Server töötleb skripti vastust ning selle põhjal moodustab ja saadab vastuse brauserisse.(Server tavaliselt kirja sisu ei muuda, vaid täiendab päist HTTP protokolli jaoks vajalike väljadega)

Noh, põhitõed on juba õpitud, kõik pole nii raske ja masendav, kui esmapilgul võib tunduda
Nüüd saate harjutada selliste lihtsate skriptide kirjutamist, et see endale selgeks teha.

Veebipoodide omanikud on "e-kaubanduse" mõistega tuttavad, kindlasti teavad nad vastust küsimusele "e-kaubandus - mis see on". Aga kui vaadata olemust, siis tekib palju nüansse ja see mõiste omandab laiema tähenduse.

E-kaubandus: mis see on?

Üldkontseptsioon on järgmine: e-kaubandus tähendab teatud lähenemist äritegevusele, mis hõlmab mitmete toimingute kaasamist, mis kasutavad digitaalset andmeedastust kaupade tarnimisel või teenuste/tööde osutamisel, sealhulgas Interneti kasutamisel.

Seega on tegemist mis tahes äritehinguga, mis tehakse elektroonilisi sidevahendeid kasutades.

Töö skeem on korraldatud järgmiselt:

  • igaüks võib olla blogija või mõni muu oma veebisaidi omanik) registreerub sellesse süsteemi;
  • saab oma lingi;
  • paneb oma veebilehele spetsiaalse koodi - ilmub e-kaubanduse partnerite võrgustiku valitud ametliku partneri reklaam;
  • jälgib saidi muutmist;
  • teenib teatud protsendi iga ostu eest, mille teeb tema saidi külastaja, kes klõpsas sidusettevõtte lingil.

WP e-kaubandus

Suur hulk inimesi on praegu e-kaubanduse vastu kirglik ja seda eelkõige soovist luua oma veebisait, ainulaadne veebipood oma toodete müügiks. Selle kasvava nõudluse rahuldamiseks on arendajad keskendunud e-kaubanduse malli loomisele. Mis see on, kaalume edasi.

Üheks selliseks malli näiteks on WordPressi e-kaubandus. See on WordPressi (üks kuulsamaid veebiressursside haldussüsteeme) mõeldud ostukorvi pistikprogramm, mis on mõeldud eelkõige ajaveebi loomiseks ja korraldamiseks. Seda pakutakse täiesti tasuta ja see võimaldab saidi külastajatel Interneti-lehel oste sooritada.

Teisisõnu võimaldab see plugin luua veebipoe (WordPressi baasil). Sellel e-kaubanduse pistikprogrammil on kõik vajalikud tööriistad, seaded ja võimalused, et vastata tänapäevastele vajadustele.