HTTP-protokolla ja Apache
- Luentotaltiointi
- HTTP (HyperText Transfer Protocol)
- Apache-WWW-palvelin
- .htaccess
- Edelleenohjaus
- Mediatyypit
- Salasanasuojaus
- Automaattinen kielivalinta (engl. content negotiation)
- Toistuvien elementtien liittäminen
- Selainten yleisimmät ongelmat
Tällä luennolla käsitellään tärkeimmät kohdat HTTP-protokollasta sekä oleellisimpia Apache-WWW-palvelimen ominaisuuksia.
HTTP (HyperText Transfer Protocol)
HTTP on protokolla, jonka avulla selain ja WWW-palvelin keskustelevat.
Selain lähettää WWW-palvelimelle pyynnön:
HEAD /www/ HTTP/1.0 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
HEAD /www/ HTTP/1.0 | pyydetään pelkkiä otsikkotietoja (HEAD) sivusta jonka osoite palvelimella on /www/ käyttäen HTTP/1.0-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 |
Palvelin vastaa:
HTTP/1.0 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
HTTP/1.0 200 OK | Statuskoodi - kaikki kunnossa |
Connection: close | Suljetaan yhteys |
Date: Tue, 06 Apr 2004 10:53:18 GMT | Päivä ja aika |
Accept-Ranges: bytes | Sallitaan tavuina määritellyt pyynnöt joissa halutaan vain osa dokumentista |
ETag: "2da29-2147-4044819d" | Tunniste |
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 | WWw-palvelimen tiedot |
Vary: Accept | Liittyy välimuistin (cachen) toimintaan |
Content-Length: 8519 | Sisällön koko |
Content-Type: application/xhtml+xml; charset=iso-8859-1 | mediatyyppi ja merkistö |
Last-Modified: Tue, 02 Mar 2004 12:44:13 GMT | Milloin viimeksi muutettu |
HTTP-otsikoita voi tutkia tarkemmin esim. seuraavilla ohjelmilla
- Tamper Data -laajennos Firefoxiin
- Web-Sniffer
HTTP Status codes
Palvelin palauttaa vastauksessa HTTP-statuskoodin, joka kertoo lyhyesti selaimelle miten pyyntö onnistui ja miten tulee jatkossa toimia. Listassa yleisimmät:
- 200 OK
- 300 Multiple Choices
- 301 Moved Permanently
- 302 Found
- 401 Unauthorized Access
- 403 Forbidden
- 404 Not Found
- 406 Not Acceptable
- 408 Request Time-out
- 500 Internal Server Error
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
- User's Guide Apache 1.3
- Modules Apache 1.3
- Apache HTTP Server Version 2.0 Documentation
- Modules Apache 2.04
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.
Edelleenohjaus
Edelleenohjaus tehdään HTTP:n location-komennolla. 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/
Monimutkaisemmat edelleenohjaukset
Todella hankalissa tapauksissa edelleenohjauksia ja paljon muutakin pystyy tekemään Apachen mod_rewriten avulla. mod_rewrite on Webmasterin linkkuveitsi, jonka käyttäminen on kuitenkin sen verran monimutkaista ettemme perehdy siihen sen tarkemmin.
Ohjataan kaikki .svm-päätteiset tiedostot vastaavan nimisiin .jpg- tai .png-päätteisiin tiedostoihin.
RewriteEngine on
RewriteOptions inherit
RewriteBase /doc/
RewriteRule ^(.*)\.svm $1 [C,E=WasHTML:yes]
RewriteCond %{REQUEST_FILENAME}.jpg -f
RewriteRule ^(.*)$ $1.jpg [S=1]
RewriteCond %{ENV:WasHTML} ^yes$
RewriteRule ^(.*)$ $1.png
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
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 ja ehkä jotkut vanhemmat
selaimet eivät ymmärrä application/xhtml+xml
-mediatyyppiä. Ongelma voidaan periaatteessa helposti
kiertää käyttämällä Apachen mod_rewrite-moduulia, jolla voidaan
säätää Apache käyttämään oikeaa mediatyyppiä sen ymmärtäville selaimille. Lisätään .htaccess-tiedostoon seuraavat rivit:
# Laitetaan rewrite-engine päälle RewriteEngine on RewriteOptions inherit RewriteBase / # Tutkitaan ilmoittaako selain tukevansa application/xhtml+xml-mediatyyppiä RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml # Tutkitaan onko pyydetty osoite .html-tiedosto ja pyyntö HTTP/1.1-protokollaa RewriteCond %{REQUEST_URI} \.html$ RewriteCond %{THE_REQUEST} HTTP/1\.1 # Jos ehdot täyttyvät niin määrätään käytettäväksi application/xhtml+xml # ja iso-8859-1-merkistö: RewriteRule .* - "[T=application/xhtml+xml; charset=iso-8859-1]"
Valitettavasti tämä "resepti" ei toimi enää Apache 2.0:ssa hakemistojen indeksitiedostojen kanssa. Ne jaetaan edelleen text/html-mediatyypillä kaikille selaimille :-(
Esimerkki
- Tekstitiedosto .html-pääte
- HTML-tiedosto .txt-pääte
Lisätietoa
Salasanasuojaus
Sijoita suojattavassa kansiossa olevaan .htaccess-tiedostoon rivit:
AuthUserFile /foo/bar/tunnus/.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 voi tarkistaa www.cc.jyu.fi-koneessa pwd-komennolla. Muissa koneissa (esim. kanto tai tukki) saatava polku EI OLE OIKEA.
Salasanan ja käyttäjätunnuksen voi luoda komennolla:
htpasswd .users tunnus
Jos .users-tiedosto luodaan ensimmäistä kertaa tai tyhjennetään niin rivin on oltava muotoa:
htpasswd -c .users tunnus
Automaattinen kielivalinta (engl. content negotiation)
Apache mahdollistaa automaattisen kielivalinnan käyttäjän selaimen asetuksien perusteella.
Multiviews
Lisätään tiedostoihin kieltä koskeva pääte:
index.html.en index.html.fi index.html.fr
Linkin viitatessa index.html-tiedostoon valitsee WWW-palvelin automaattisesti parhaan kielivaihtoehdon.
Eri kieliversioiden välilä pitää pystyä siirtymään myös tavallisten linkkien avulla koska kaikki käyttäjät eivät (vielä) osaa valita selaimesta suosikkikieltään.
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
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
Tyyppimääre on hyvä laittaa muutenkin .shtml-tiedostoilal sillä XHTML-muotoiset tiedostot tunnistetaan tyypiksi text/xml ja jaetaan sen mukaisesti. Tämä aiheuttaa ongelmia Internet Explorerilla.
Kertoo dokumentin muutosajankohdan:
<!--#echo var="LAST_MODIFIED"-->
Lisää tähän kohtaan dokumenttia tiedoston linkit.ssi sisällön:
<!--#include virtual="linkit.ssi"-->
Esimerkki: pohja.txt
Lisätietoja SSI:stä löytyy osoitteista:
- http://www.apache.org/docs/mod/mod_include.html
- http://www.mit.jyu.fi/opiskelu/seminaarit/ohjelmistotekniikka/cgi/#Heading13
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.
XSL Transformations
XHTML on XML-muotoista tietoja, 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ä.
Content Management Systems
Tuotetaan sivut jollain järjestelmällä, joka osaa tuottaa sopivanlaisia XHTML-elementtipaloja ja liittää ne sopivalla tavalla yhdeksi sivuksi.
Selainten yleisimmät ongelmat
Suuri osa www-sivujen ongelmista johtuu käytettyjen selainten rikkinäisistä, vääristä tai puutteellisista tavoista implementoida suosituksia.
- Selaimen pitäisi kunnioittaa palvelimen määrittämää mediatyyppiä
- IE toimii väärin tulkitessaan tiedoston mediatyyppiä tiedoston päätteen perusteella.
- Selaimen pitäisi lähettää www-palvelimelle lista vain tuetuista mediatyypeistä
paremmuusjärjestyksessä
- Viimeisenä vaihtoehtona voi lähettää */*