HTTP-protokolla, Apache ja CMS - Luento 12

Tällä luennolla käsitellään tärkeimmät kohdat HTTP-protokollasta sekä oleellisimpia Apache-WWW-palvelimen ominaisuuksia. Käydään lyhyesti läpi erilaisia esimerkkejä laajojen www-sivustojen ylläpidosta.

Luentotaltiointi

Ongelmia videon katselussa?

HTTP (HyperText Transfer Protocol)

HTTP on protokolla, jonka avulla selain ja WWW-palvelin keskustelevat.

Firefox-selaimen ja WWW-palvelimen välistä HTTP-liikennettä on helppo seurata Tamper Data -laajennuksella

Selain lähettää WWW-palvelimelle pyynnön:

GET /www/ HTTP/1.1
Connection: keep-alive
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: appro.mit.jyu.fi
Referer: http://appro.mit.jyu.fi/
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624
Keep-Alive: 300
Selaimen lähettämät HTTP-otsakkeet selityksineen
GET /www/ HTTP/1.0 pyydetään informaatiota (GET), jonka osoite palvelimella on /www/ käyttäen HTTP/1.1-protokollaa
Connection: keep-alive Käsketään pitää yhteys päällä
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, video/x-mng, image/png, image/jpeg, image/gif;q=0.2, */*;q=0.1 Luetellaan selaimen ymmärtämät mediatyypit. Kerrotaan myös mitä mediatyyppejä suositaan q-arvojen avulla
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Luetellaan kelpaavat merkistöt
Accept-Encoding: gzip,deflate Luetellaan tuetut koodaustavat (pakkaus)
Accept-Language: en-us,en;q=0.5 Halutut kielet
Host: appro.mit.jyu.fi Palvelimen nimi
Referer: http://appro.mit.jyu.fi/ Osoite josta ollaan tulossa (sivu jolla olevaa linkkiä on klikattu)
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Selaimen tiedot
Keep-Alive: 300Kertoo kuinka monta sekuntia yhteyttä pidetään yllä. Vain HTTP/1.0-protokollassa, mutta käytetään yhteensopivuussyistä. Oikeastaan muoto pitäisi olla Keep-Alive: parametri=arvo

Palvelin vastaa:

HTTP/1.1 200 OK
Connection: close
Date: Tue, 06 Apr 2004 10:53:18 GMT
Accept-Ranges: bytes
ETag: "2da29-2147-4044819d"
Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux) AxKit/1.62 mod_python/2.7.8 Python/1.5.2 mod_ssl/2.8.12 OpenSSL/0.9.6b DAV/1.0.3 PHP/4.1.2 mod_perl/1.26 mod_throttle/3.1.2
Vary: Accept
Content-Length: 8519
Content-Type: application/xhtml+xml; charset=iso-8859-1
Last-Modified: Tue, 02 Mar 2004 12:44:13 GMT
WWW-palvelimen vastaus
HTTP/1.1 200 OKStatuskoodi - kaikki kunnossa
Connection: closePalvelin sulkee yhteyden. Normaalisti yhteys on pysyvä (persistent), jotta selain voi tehdä useita pyyntöä (kuvat, css, javascript jne.).
Date: Tue, 06 Apr 2004 10:53:18 GMTPäivä ja aika, koska vastaus on lähetetty
Accept-Ranges: bytesSallitaan tavuina määritellyt pyynnöt joissa halutaan vain osa dokumentista
ETag: "2da29-2147-4044819d"Tunniste. Tunniste muuttuu dokumenttia muutettaessa.
Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) AxKit/1.62 mod_python/2.7.8 Python/1.5.2 mod_ssl/2.8.12 OpenSSL/0.9.6b DAV/1.0.3 PHP/4.1.2 mod_perl/1.26 mod_throttle/3.1.2WWw-palvelimen tiedot
Vary: Accept-EncodingVaihteleeko pyydetty resurssi jonkun ehdon mukaan. Tärkeä tieto esim. välimuisteille. Accept-Encoding: esim. erilainen pakkaus. Accept-Language: tarjolla useita kieliversioita. User-Agent: sivun sisältö riippuu selaimesta.
Content-Length: 8519Sisällön koko
Content-Type: application/xhtml+xml; charset=iso-8859-1mediatyyppi ja merkistö
Last-Modified: Tue, 02 Mar 2004 12:44:13 GMTMilloin viimeksi muutettu

HTTP-otsikoita voi tutkia tarkemmin esim. seuraavilla ohjelmilla

HTTP Status codes

Palvelin palauttaa vastauksessa HTTP-statuskoodin, joka kertoo lyhyesti selaimelle miten pyyntö onnistui ja miten tulee jatkossa toimia. Listassa yleisimmät:

Evästeet (engl. Cookie)

Eväste on lyhyt tekstitieto palvelimen lähettämä tekstitieto, jonka selain tallentaa omaan muistiinsa. Selain lähettää saman tiedon takaisin palvelimelle HTTP-otsikoissa sivua pyydettäessä. Tämän avulla voidaan käyttäjän tai palvelimen päähän tallentaa tietoa siitä mitä käyttäjän valinnoista. Evästeellä on määrätty käyttöaika.

Tässä lyhennetyt otsikkotiedot. Ensin kysytään sivua:

GET / HTTP/1.1
Host: www.google.fi

Palvelin lähettää pyynnön evästeen tallentamisesta:

HTTP/1.0 200 OK
Set-Cookie: PREF=ID=a777b6655544c:TM=1234556789:LM=98765431:S=rMX_ger_AbCDefG; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.fi

Selain pyytää toista sivua samalla sivustolla:

GET /help/faq_images.html HTTP/1.1
Host: www.google.fi
Cookie: PREF=ID=a777b6655544c:TM=1234556789:LM=98765431:S=rMX_ger_AbCDefG

Nyt palvelin tietää, että kyse on samasta selaajasta ja voi toimia sen mukaan.

Apache-WWW-palvelin

Apache on maailman eniten käytetty WWW-palvelinohjelmisto

Suurin osa www-sovellusten tarvitsemasta toiminnallisuudesta kannattaa tehdä jo WWW-palvelimella koska selainten erot ja laajennuksien puute hankaloittavat joidenkin asioiden suorittamista selaimissa.

.htaccess

.htaccess on Apache-WWW-palvelimissa käytetty tiedosto, jolla voidaan muuttaa palvelimen asetuksia. .htaccess-tiedoston avulla voidaan toteuttaa mm. salasanasuojaus, edelleenohjaus ja MIME-tyyppien lisäykset.

Kaikki seuraavaksi kerrotut ominaisuudet toimivat Apache 2.0:ssa. Suurin osa toimii myös vanhemmassa Apache 1.3:ssa. Huomaa, että yksi määritys on aina yhdellä rivillä. Komennon ja parametrien välit erotellaan aina välilyönneillä.

Edelleenohjaus

Edelleenohjaus tehdään HTTP:n Location-otsikkotiedoilla. Apachesta löytyy suoraan valmiit komennot tätä varten. Edelleenohjausta EI PIDÄ TEHDÄ käyttämällä väliaikaisia www-sivuja ja niihin tehtyjä epästandardeja virityksiä!

Väliaikainen edelleenohjaus (302)

Redirect /tt-appro/index.html http://appro.mit.jyu.fi/

Edelleenohjattavan sivun osoite kerrotaan palvelimen juuresta lukien. Kohdeosoite pitää kertoa kokonaisuudessaan.

Pysyvä edelleenohjaus (301)

Redirect permanent /tt-appro/index.html http://appro.mit.jyu.fi/

Pysyvä edelleenohjaus tehdään lisäämällä avainsana permanent.

Useamman tiedoston edelleenohjaus

Jos halutaan samalla kertaa edelleenohjata useampi tiedosto samaan kohteeseen käytetään RedirectMatch-komentoa, joka ymmärtää kohdetiedostossa säännöllisiä lausekkeita (engl. regular expressions, regexp).

Edelleenohjataan kaikki pc-alkuiset tiedostot sekä kaikki win-alkuiset tiedostot:

RedirectMatch permanent /doc/tietokone/pc.* http://appro.mit.jyu.fi/doc/tietokone/
RedirectMatch permanent /doc/kayttojarjestelma/win.* http://appro.mit.jyu.fi/doc/kayttojarjestelma/

Virhedokumentti

Seuraavalla komennolla voidaan määrätä mikä dokumentti palautetaan, jos selain on pyytänyt dokumenttia, jota ei ole olemassa:

ErrorDocument 404 /~omatunnus/cgi-bin/virhedokumentti.html

Mediatyypit

Mediatyyppi kertoo selaimelle minkälainen tiedosto on kyseessä.

Selain ei saa itse arvailla tiedoston tyyppiä tiedostopäätteen perusteella.

Esimerkki mediatyypin määrittelystä .htaccess-tiedostossa AddType-komennolla:

#määrätään .html-päätteisten tiedostojen mediatyypiksi text/plain
AddType text/plain .html
AddType text/html .txt

Usein käytettyjä mediatyyppejä

AddType text/xml .xml
AddType text/xml .xsl
AddType application/x-ogg .ogg
AddType application/smil+xml .smil
AddType video/avi .avi
AddType video/x-ms-wmv .wmv
AddType application/vnd.ms-excel .xls
Addtype application/msword .doc
Addtype application/x-msaccess .mdb
AddType audio/x-mp3 .mp3
AddType text/plain .sql
AddType application/octet-stream .exe
AddType application/xhtml+xml .xhtml

Esimerkki

Lisätietoa

application/xhtml+xml

W3C:n suositus XHTML:n mediatyypeistä sanoo, että XHTML 1.1 -dokumentit pitäisi jakaa selaimille käyttäen application/xhtml+xml-mediatyyppiä.

Mozillassa voi tarkistaa tiedoston mediatyypin valitsemalla View|Page Info.

Valitettavasti Internet Explorer (myös versio 7) ja ehkä jotkut vanhemmat selaimet eivät ymmärrä application/xhtml+xml-mediatyyppiä. Ongelma voidaan kiertää

Salasanasuojaus

Sijoita suojattavassa kansiossa olevaan .htaccess-tiedostoon rivit:

AuthUserFile /foo/bar/tunnus/html/.users
AuthGroupFile /dev/null
AuthName ByPassword
AuthType Basic
<Limit GET>
require valid-user
</Limit>

AuthUserFile-kohtaan annettava polku on oltava www-palvelimella toimiva ja sen on osoitettava salasanatiedostoon. Oikean polun alun voi tarkistaa jalava.cc.jyu.fi-koneessa kirjoittamalla siellä echo $HOME

[tjlahton@halava ~]$ echo $HOME
/ithome3/368/tjlahton

Saatuun polkuun pitää vielä lisätä html-kansio ja sen mahdolliset alikansiot. esim.

/ithome3/368/tjlahton/html/nano/.users

Salasanan ja käyttäjätunnuksen voi luoda komennolla htpasswd. Jos .users-tiedosto luodaan ensimmäistä kertaa tai tyhjennetään niin rivin on oltava muotoa:

htpasswd -c .users tunnus

Muut tunnukset saa luotuja jatkossa komennolla:

htpasswd .users tunnus

Huomaa, että salasanasuojaus on vain kevyt suojausmenetelmä. Salasanat liikkuvat verkossa lähes salaamattomina ja osaava pystyy poimimaan ne verkkoliikenteestä. Toiset www-palvelimen käyttäjät saattavat pystyä myös tutkimaan www-hakemistojasi vaikka niitä ei selaimella pystyisikään.

Hakemiston indeksitiedosto

Selaimella voidaan pyytää hakemistoa esim. http://users.jyu.fi/~tunnus/harkka/. Hakemiston sisällä täytyy olla jokin dokumentti, jonka palvelin voi antaa selailijalle. Tavallisesti tämän tiedoston nimi index.html. Hakemistosta annettavan oletustiedoston voi muuttaa toiseksi luomalla hakemistoon .htaccess-nimisen tiedoston ja kirjoittamalla esimerkiksi komennon:

DirectoryIndex index.shtml index.php index.html

Tässä tapauksessa ensimmäisenä hakemistosta tarjotaan index.shtml-nimistä tiedostoa, toiseksi index.php-nimistä tiedostoa ja viimeiseksi index.html-nimistä tiedostoa. Ellei mitään näistä löydy hakemistosta, niin Apache luo HTML-sivun, joka näyttää hakemiston sisällä olevat tiedostot.

Automaattinen kielivalinta (engl. content negotiation)

Apache mahdollistaa automaattisen kielivalinnan käyttäjän selaimen asetuksien perusteella.

Typemaps

Määrätään kansion indeksitiedostoksi index.var, joka kertoo tarkemmin mikä tiedosto vastaa mitäkin kieltä. Indeksitiedostoksi voidaan antaa useita vaihtoehtoja joista ensimmäistä löytyvää käytetään.

DirectoryIndex index.var index.html

Määrätään myös kielten tärkeysjärjestys (LanguagePriority) jos selain ei sitä itse kerro.

Lisäksi määrätään että noudatetaan itse määrättyä tärkeysjärjestystä jos selaimen antamista vaihtoehdoista löytyy kaksi yhtä hyvää(ForLanguagePriority Prefer). Ilman tätä palvelin antaisi virheen 300 (MULTIPLE CHOICES) ja listan vaihtoehdoista.

Jos vaihtoehdoista ei löydy ollenkaan selaimen haluamia kieliä niin määrätään noudatettavaksi omaa tärkeysjärjestystä (ForLanguagePriority Fallback). Ilman tätä määritystä saataisiin virhe 406 (NOT ACCEPTABLE) ja lista vaihtoehdoista.

LanguagePriority en fi
ForceLanguagePriority Prefer Fallback

Määrätään vielä oikea käsittelijä .var-päätteisille tiedostoille:

AddHandler type-map .var

index.var-tiedostossa kerrotaan eri vaihtoehtojen osoitteet, niiden kielet ja mediatyypit. Muita valintaan vaikuttavia tekijöitä voisivat olla myös merkistö ja enkoodaus (pakkaus).

Esim. suomenkielisestä dokumentista voisi löytyä pakkaamaton ja pakattu versio sekä näistä kummastakin text/html ja application/xhtml+xml -versiot.

URI: index.html.fi
Content-Language: fi
Content-Type: text/html

URI: index.html.en
Content-Type: text/html
Content-Language: en

Typemaps-esimerkki

Toistuvien elementtien liittäminen

Usein halutaan sivulle toistuvia elementtejä, kuten navigointi, logot, tekijätiedot jne. Toistuvan elementin muuttaminen vaatii paljon turhaa työtä. Tässä yksinkertaisia menetelmiä samojen elementtien liittämiseksi useille www-sivulle:

SSI (Server Side Includes)

SSI-komennot ovat HTML-dokumenttiin upotettuja käskyjä joilla voidaan tulostaa muuttujien arvoja tai suorittaa ohjelmia

ATK-keskuksen www-palvelimessa SSI-komentoja sisältävien tiedostojen pääte pitää olla .shtml

Palvelinta voi käskeä tulkitsemaan SSI-komennot mistä tahansa tiedostoista määräämällä:

AddType text/html .paate
AddHandler server-parsed .paate

Kertoo dokumentin muutosajankohdan:

<!--#echo var="LAST_MODIFIED"-->

Päivämäärän esitystapaa voidaan muuttaa SSI-komennolla:

<!--#config timefmt="%Y-%m-%e %T"-->

Lisää tähän kohtaan dokumenttia tiedoston linkit.ssi sisällön:

<!--#include virtual="linkit.ssi"-->

Liitettävään tiedostoon voidaan viitata myös puoliabsoluuttisella viitteellä:

<!--#include virtual="/~omatunnus/hakemistoni/address.include"-->

SSI:llä voidaan määrätä vakiomerkkijono, jota tulostetaan useampaan paikkaan dokumenttia:

<!--#set var="title" value="Nanonano"-->
<!--#set var="css" value="/~omatunnus/hakemistosi/demo2.css"-->
<head>
  <title><!--#echo var="title" --></title>
  <meta name="keywords" content="<!--#echo var="title" -->">
  <link href="<!--#echo var="css" -->" rel="stylesheet" type="text/css" title="Tyylipohja" />
</head>
<body>
    <h1><!--#echo var="title" --></h1>

Vakiomuuttujat voi keskittää vaikkapa yhteen tiedostoon.

Esimerkki: pohja.txt

Lisätietoja SSI:stä löytyy osoitteista:

WWW-ohjelmointikielet

Käytetään ohjelmointikieltä, joka osaa dynaamisesti liittää tietoa sivulle. Esimerkiksi PHP:llä:

index.php:

<?php include("alkumaaritykset.xhtml"); ?>

<h1>Nanonanon sivut</h1>

<p>Kivaa testiä!</p>

<?php include("loppumaaritykset.xhtml"); ?>

alkumaaritykset.xhtml:

<?php echo('<?xml version="1.0" encoding="iso-8859-1"?>'."\n"); ?>
<!DOCTYPE html
 PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" >
  <head>
    <link href="http://appro.mit.jyu.fi/www/demot/demo2/demo2.css" type="text/css" rel="stylesheet" />
  </head>
  <body>
    <div class="navbar">
      <ul>
        <li><a href="http://palvelin/kayttaja/hakemisto1/">Diiba</a></li>
        <li><a href="http://palvelin/kayttaja/hakemisto2/">Daaba</a></li>
      </ul>
    </div>

loppumaaritykset.xhtml:

    <address>
    <a href="http://palvelin/kayttaja/">Nano Nano</a><br />
    <a href="mailto:nanonano@it.jyu.fi.invalid">nanonano@it.jyu.fi.invalid</a>
    </address>
  </body>
</html>

Esimerkistä puuttuu (vaihtuvan) title-elementin määritys. Huomaa myös että dynaamiset kielet kuormittavat palvelinta enemmin kuin staattiset sivut. Esimerkissä on ongelmia myös siinä mielessä, että sivun tekijä saattaa unohtaa liittää alku- ja loppupalaset dokumenttiin.

Tietokannat ja sivupohjat

Parempi ratkaisu olisi ns. template-tyylinen ratkaisu, jossa sivun tekijä kirjoittaa ainoastaan sivun sisällön ja palvelimelle toteutettu ohjelma liittää automaattisesti tarvittavat palaset ympärille. Sisältö voi tulla esim. erillisestä XML- tai tekstitiedostosta, tietokannasta tai muista tietovarastoista. Sisältöjä tietokantaan voidaan tuottaa myös ohjelman omilla työkaluilla.

Esiprosessointi

SSI:n käyttäminen rasittaa palvelinta huomattavasti koska palvelin joutuu aina tekemään tiedostojen käsittelyn vaikka se ei olisi tarpeellista. Järkevämpää olisi tehdä kaikki tarvittavat tiedostojen lisäykset yms. jo valmiiksi esiprosessoimalla.

Parempi tapa sisällyttää muita tiedostoja ja merkitä muutospäivämäärät olisi käyttää Website Meta Languagea (WML) tai C/C++-esikääntäjää tai jotakin muuta työkalua, joka tukee isojen sivukokonaisuuksien hallintaa

WML (Website Meta Language)

WML on ilmainen HTML:n tuottamiseen tarkoitettu esiprosessointijärjestelmä, joka koostuu yhdeksästä erillisestä kielestä.

Lähtödokumentti suodatetaan läpi yhdeksästä eri vaiheesta ennen lopullisen dokumentin muodostumista.

XSL Transformations

XHTML on XML-muotoista tietoa, joten sitä voidaan käsitellä erilaisilla XML-prosessointiin tarkoitetuilla välineillä ja kielillä. XSLT on XML-sovellus, jolla voidaan muuntaa ja yhdistellä XML-dokumentteja. Erityisesti tämän avulla voitaisiin liittää myös toistuvia elementtejä.

CMS (Content Management System)

Tuotetaan sivut jollain järjestelmällä, joka osaa tuottaa sopivanlaisia XHTML-elementtipaloja ja liittää ne sopivalla tavalla yhdeksi sivuksi.

CMS mahdollistaa helpon tavan tuottaa, hallita, jakaa ja julkaista tietoja

Luokittelua

Wiki

Wiki on avoin julkaisujärjestelmä, jonka sisältöä voivat kaikki lukijat vapaasti lisätä ja muuttaa.

Wikillä voi esim.

Wikiohjelmistoja on useita. Yksi esimerkki Wikiohjelmistosta on Twiki.

Lisätietoa:

Zope/Plone

Zope on pythonilla kirjoitettu vapaa www-sovelluspalvelin.

An Introduction to Zope

Muita esimerkkejä

Lisätietoa

Oman WWW-palvelun perustaminen

Lisätietoa

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/www/luennot/luento12/
© Antti Ekonoja (anjoekon@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2008-03-12 16:46:54
Informaatioteknologia - Jyväskylän yliopiston IT-tiedekunta ja avoin yliopisto