Webserver-programmering
informasjon
oppdatert: 11. mars 2005
Webserver-programmering og CGI

I begynnelsen var det kun leselenker på weben til statiske noder, altså webserveren returnerte kun filer til nettleseren. En så raskt nytten av søke- og oppdaterings-lenker samt dynamiske noder. Dynamiske noder er programmer som startes av webserveren. Nettleseren kan i søke- og oppdaterings-lenker sende med tilleggsopplysninger til webserveren. Disse data bør webserveren gjøre tilgjengelig for programmet i noden. For å sikre portabiliteten til programmene i de dynamiske nodene var det behov for en standardisert grenesnitt mot webserverene. NCSA (National Center for Supercomputing Applications), som skrev forløperen til Apache-serveren, definerte CGI (Commen Gateway Interface). CGI spesifikasjoneen er tilgjengelig på http://hoohoo.ncsa.uiuc.edu/cgi/. CGI er en standard for kommunikasjon mellom webserver og programmer. Det er fire måter CGI formidler informasjon mellom webserver og programmer:

  • environment-variabler
  • kommandolinje parameter
  • standard input
  • standard output
De tre første metodene benytter webserveren for å sende informasjon til CGI-programmet. Den fjerde metoden benytter CGI-programmer for å sende data tilbake til webserveren. CGI-programmer kan altså kun sende data til webserveren via standard-output.

I beskrivelsen av weben som en nodenettverk ble lenker delt opp i tre typer: lese-, søke- og oppdaterings-lenker. De tre lenketypene er implementert i HTTP-protokollen ved metodene GET og POST. Lese- og søke-lenker er basert på GET-request og oppdaterings-lenker er basert på POST-request. Klienten kan i søke- og oppdaterings-lenker sende med tilleggsopplysninger. Disse er derfor mest aktuelle i forbindelse med webserver-programmering. I søke lenker blir tilleggsinformasjonen sendt som en søkestreng som postfikses til URL'en. I henhold til HTTP-spesifikasjonen må webserverene kunne håndtere minimum 256 byte lang URL (inklusiv søkestreng), men alle vanlige webservere håndterer mye lengre URL enn dette. Skal større mengde data sende til webserverprogram bør oppdateringslenker benyttes. Fordelen med søke-lenker er at disse kan lagres som bokmerker.

Avhengig av lenketype vil webserveren gjøre tilleggsopplysningen tilgjengelig på ulike måter for CGI-programmet. Ved bruk av søke-lenker vil tilleggsopplysningene plasseres i environment-variablen QUERY_STRING. Ved bruk av oppdaterings-lenker vil tilleggsopplysningene være tilgjengelig via standard input (stdin).

Innholdet i QUERY_STRING består av recorder med to felt. Hver record er separert med og-tegnet &. Hvert felt er separert med likhets-tegnet = tegn. Alle mellomrom i strengen er erstattet av pluss-tegnet +. De fleste ikke engelske alfanummeriske tegn er representert med heksadesimal verdi. Heksadesimale verdier er prefikset med prosent-tegnet %. Environment-variabler er behandlet i eget kapittel nedenfor.

Webserver gir kun kommandolinje parameter til CGI-programmer når QUERY_STRING ikke inneholder likhetstegn. I HTML er det kun ISINDEX-elementet som gir mulighet for dette (elementetet er på vei ut av HTML-spesifikasjonene).

De ulike språk en benytter til webserver-programmering har noe ulike grenesnitt for hvordan environment-variabler og andre request-opplysniger kan kan aksesseres.

Webserver-programmer
Webserver-programmer kan i prinsippet skrives i de fleste programmerings-språk. Ulike webservere har ulik støtte for ulike programmerings-spåk. I Barken kan en montere inn Tomcat-server som støtter .jsp og servlet som kan skrives i java, en kan montere inn Zope-server som støtter zope-programmer eller Apache-server med spesielle støtte for perl, python og php.

Apache serveren kan også kjøre alle eksiverbare programmer og skript som har filekstensjon .cgi. Programmene bør kompileres i Barken og dermed begrenser antall språk seg til hvilke kompilator en har tilgjengelig i Barken, dette er i hovedsak gcc (c++ kompilatoren). Barken er i tillegg utstyrt med mange skript-intepretere. Første linje i skriptet må angi hvilken intepreter som skal kjøre skriptet. Her følger en liste over tilgjengelige intepretere og hvilket direktiv som må oppgis på første linjen i skriptet:
Intepreter Direktiv
Bourne-shell #! /bin/sh
C-shell #! /bin/csh
Bash-shell #! /usr/local/bin/bash
Z-shell #! /usr/local/bin/zsh
Perl #! /usr/local/bin/perl
Python #! /usr/local/bin/python
Jython #! /usr/local/bin/jython

Fil-ekstensjoner, fil-rettigheter, fil-aksess metoder og plassering av filer i Barken.
Filene må ha følgende ekstensjoner, rettigheter og plassering for å bli korrekt behandlet av webserveren:

Server
programmer
Filekstensjon Filrettigheter*) Mulige
request
metoder
Forklaring
(ingen) .html
.htm
644 GET
HEAD
Filen kan befinner seg hvor som helst i din web-katalog. Alle brukere på maskinen må ha leserettigheter til filen. Webserven vil på raskeste måte sendes filen til nettleseren. PHP-kode eller SSI-direktiver i filen vil ikke bli behandlet av serveren
CGI-skript .cgi 700**) GET
POST
HEAD
Filen kan befinner seg hvor som helst i din web-katalog. Våre webservere kjører skriptet med dine rettigheter på maskinen. Dette betyr at at du m&airng; ha kjørerettigheter på filen. Sett derfor filrettighetene til 700 på alle dine CGI-skript. Første linjen i skriptet bestemmer hvilken intepreter (bourne, perl, python, etc) som skal benyttes til kjøre skriptet.
SSI .shtml 644***) GET
HEAD
Filen kan befinner seg hvor som helst i din web-katalog. Webserven vil lese .shtml-filen med dine rettigheter, slik det kun er nødvendig at du har leseaksess til selve filen. Default filrettigheter kan benyttes. Webserveren vil utføre SSI-direktiver med dine brukerrettigheter, slik at kun skript og kommandoer som du har kjøre rettighteter til kan utføres.
Perl .pl 700**) GET
POST
HEAD
Filen kan befinner seg hvor som helst i din web-katalog. Webserveren vil kjører Perl-skriptet med dine rettigheter. Dette betyr at du må ha kjørerettigheter på filen. Sett derfor filrettighetene til 700 på alle dine Perl-skript. Perl-kode i .pl-filer trenger ikke starte med direktivet: #! /usr/local/bin/perl
Python .py 700**) GET
POST
HEAD
Filen kan befinner seg hvor som helst i din web-katalog. Webserveren vil kjører Python-skriptet med dine rettigheter. Dette betyr at du må ha kjørerettigheter på filen. Sett derfor filrettighetene til 700 på alle dine Python-skript. Python-kode i .py-filer trenger ikke starte med direktivet: #! /usr/local/bin/python
PHP4 .php 644 GET
POST
HEAD
Filen kan befinner seg hvor som helst i din web-katalog. Webserven vil lese PHP-koden med dine rettigheter, slik det kun er nødvendig at du har leseaksess til selve .php-filen. Default filrettigheter kan benyttes.
JSP .jsp 644 GET
POST
HEAD
Filen må befinne seg hvor som helst i din web-katalog. Webserven vil utføre JSP-koden i filen
Servlet .class 644 GET
POST
HEAD
Filenen kan lagres i din webapps/WEB-INF/classes-katalog (vi har installert på området ditt). Se omtale i "Servlet"-boken (i denne boken) for aksess av klasse-filer.

*) Se omtale av FTP- og SSH-protkollen for forklaring på filrettigheter og hvordan disse settes.
**) Katalogen til skriptet eller en foreldre-katalog må innholde en fil med navnet .htaccess (dot-htaccess) som har følgende linje:
Options ExecCGI
***) Katalogen til skriptet eller en foreldre-katalog må innholde en fil med navnet .htaccess (dot_htaccess) som har følgende linje:
Options +Includes

Krav til utsendelse av hodefelt
Utsendelse av hodefelt sørger i de fleste tilfeller webserveren automatisk for med unntak av CGI-, Perl- og Python-skript samt servlet. For skriptenes vedkommende er utsendelse avhengig av aksess metode. I de tre førte aksessmetodene nedenfor må skriptet selv sende ut hodefelt:

  1. URL til skriptet skrives i adressefeltet i nettleseren
  2. URL til skriptet oppgis i link- eller form-element i HTML, XHTML, XML
  3. CGI-aksess via SSI-direktiv (f.eks: <!--exec cgi="script.cgi" -->)
  4. Kommando aksess via SSI-direktivet (f.eks: <!--exec cmd="script.sh" -->)
Obligatorisk hodefelt er "Content-Type:". Hodefeltene må være separert fra resten av innholdet med en blank linje.

Environment-variabler
Et viktig begrep i webserver-programmering er environment-variabler. Nest alle webserver-programmer benytter environment-variabler. For den som den som ikke er så kjent med begrepet environment-variabler skal her prøve å gi en kort forklaring:

Environment-variabler er et vidt begrep og betegner generelt en del variabler som innholder system informasjon. Hvilke variabler og hvordan de er tilgjengelig er avhengig av hvor en befinner seg. I Bourne-shell kan variablene aksesseres ved å prefikse variabelnavn med dollartegn. På Command Promt i Microsoft må variabelnavnene omsluttes av prosenttegn. En vanlig environment-variabel innenfor kommando-shell er PATH som indikerer hvilke kataloger systemet skal lete i for å finne programmet en ønsker å kjøre (om ikke fullstendig path oppgis). F.eks skriv følgende på Command Promt i Microsoft:echo %PATH%.

CGI har standardisert navn på en rekke environment-variabler, men variablene er tilgjengelig på ulike måter i SSI, CGI, PHP, etc. Hvordan de aksesseres er beskrevet i omtalen av de ulike språkene i denne dokumentasjonen. De mest benyttete environment-variabler i webserver-programmering er: QUERY_STRING, REQUEST_METHOD, PATH_INFO, PATH_TRANSLATED, SCRIPT_NAME, forklaring følger:

CGI environment variabler
Variabel Forklaring
AUTH_TYPE Ved HTTP-basert beskyttelse av filer vil klient sende hodefeltet Authorization. Innholdet er vanligvis kodet i base64, men dette omgjøres av webserveren. Innholdet i variablen har følgend format: brukernavn:passord. Vi tilbyr fortiden ikkke HTTP-basert filbeskyttelse og feltet blir følgelig ikke brukt
CONTENT_LENGTH Innholdet leses ut av Content-length hodefeltet satt av klient. Her oppgis lengden på selve "kroppen" i HTTP-request.
CONTENT_TYPE For POST- og PUT-request som har data i "kroppen" angis her MIME-typen til innholdet.
GATEWAY_INTERFACE Versjon av CGI webserveren støtter. Våre webservere støtter CGI versjon 1.1
PATH_INFO Kan benyttes av klienten for oppgi annet CGI-programmet enn hva URL indikerere
PATH_TRANSLATED Oversett PATH_INFO navn til fysisk sti i filsystemet på webserveren
QUERY_STRING Ved bruk av søke- og oppdaterings-lenker vil informasjonen som sendes fra nettleseren være tilgjengelig for CGI-programmer i environment-variablen QUERY_STRING. Innholdet i QUERY_STRING består av recorder med to felt. Hver record er separert med og-tegn (& tegn). Hver felt er separert med likhetstegn (= tegn). Alle mellomrom i strengen er erstattet av pluss-tegn (+ tegn). De fleste ikke engelske alfanummeriske tegn er representert med heksadesimal verdi. Heksadesimale verdier er prefikset med prosenttegn (% tegn).
REMOTE_ADDR IP-nummer til klient.
REMOTE_HOST Domenenavn på klientmaskin. Dette blir ikke satt av våre server p.g.a. av dette vil redusere responstiden.
REMOTE_IDENT Identifisering av klient vi hjelp protokoll spesifisert i RFC 931. Våre servere setter ikke variablen p.g.a. av dette reduserer responstiden og få klienter som støtter standarden.
REMOTE_USER Brukernavn som benyttes for autorisering. Benyttes ikke av våre webservere
REQUEST_METHOD Angir hvilken type HTTP-anmodning klienten har: GET, HEAD, POST, PUT etc
SCRIPT_NAME Navn på CGI-program oppgitt i URL
SERVER_NAME Navn på server. For våre webservere slutter w%n.registrar.no der %n står for et nummer.
SERVER_PORT Hvilke port nummer klienten har sendt anmodninge til: 80
SERVER_PROTOCOL Protokoll navn og versjon benyttet i anmodningen: HTTP/0.9, HTTP/1.0 eller HTTP/1.1
SERVER_SOFTWARE Informasjon om webserver. Generelt format: webservernavn/versjon

Hodefelt variablene
Alle hodefelt som klient sender blir plassert i environment-varibler. Navnet på environment-variablen er likt navnet på hodefeltet, men prefikset med HTTP_. Hodefelt som allerede plassert i environmnent-variabler blir ikke satt omigjen her. Dette gjelder: Authorization, Content-type og Content-length. Andre vanlige hodefelt klienten sender er gjenngitt omtalt her, se HTTP for generell omtalt av hodefelt.
Variabel Forklaring
HTTP_ACCEPT Innholder en liste av MIME-typer som angir hvilke formater klienten aksepter i svaret
HTTP_ACCEPT_CHARSET Inneholder en liste av tegnsett kliente aksepterer i svaret
HTTP_ACCEPT_LANGUAGE Hvilke språk som takles av klient
HTTP_COOKIE Cookie informasjon
HTTP_HOST Domenenavn i URL oppgitt i anmodningen
HTTP_REFERER URL til siden hvor linken ble trykket
HTTP_USER_AGENT Hvilken type nettleser som benyttes.
HTTP_VIA Informasjon om anmodningen har gått via proxy

Apache spesifikt tillegg
Vi benytter Apache-webservere derfor vil følgende variablen i tillegg bli satt.
Variabel Forklaring
DOCUMENT_PATH_INFO
DOCUMENT_ROOT
PATH Innholdet i environment-variablen PATH tilhørende Linux-shellet Apache kjører under.
REMOTE_PORT Port benyttet hos klient
REQEST_URI Fullstendig URL som klienten anmodet om
SCRIPT_NAME Fullstendig URL til CGI-script-filen som ble kalt
SCRIPT_FILENAME Absolutt filnavn til CGI-script-filen
SCRIPT_URI Fullstendig URL til CGI-script-fil som klienten anmodet om
SCRIPT_URL Samme som SCRIPT_NAME
SERVER_ADMIN E-postadresse til ansvarlig for server. Våre webserver setter variablen til firmapost@registrar.no

SSI spesifikt tillegg
Når en benytter SSI vil følgende variabler i tillegg være tilgjengelig.
Variabel Forklaring
DATE_GMT Innholder serverklokken i GMT
DATE_LOCAL Innholder serverklokken lokal tid
DOCUMENT_NAME Filnavn uten sti
DOCUMENT_URI Innholder URL som brukeren spurte etter
LAST_MODIFIED Dato for når dokument bruker spør etter sist ble modifisert
USER_NAME Navn på brukeren som startet Apache-serveren