Apache-www-palvelimen ominaisuudet

Käydään läpi kaksi hyödyllistä Apache-palvelimen ominaisuutta ja helpotetaan niillä omien sivujen ylläpitoa ja suojausta. Aihe on käsitelty Apache-luennolla.

Oppimistavoitteet

Tämän ohjauksen jälkeen sinun pitäisi osata:

Tarvitset pääteyhteyden

Tämän ohjauksen tehtävät vaativat SSH-yhteyden yliopiston palvelimelle, koska .htaccess-tiedosto on luotava siellä ja salasanatiedosto vaatii komentorivikomennon. Yhteyden muodostaminen on käyty läpi komentoriviluennolla ja ohjaus 1:ssä.

1. SSI (Server Side Includes)

Samanlaisena toistuvien osien ylläpito on vaivalloista, koska sama koodi joudutaan kopioimaan jokaiselle sivulle. Nanonanon sivustolla navigointi ja tekijätiedot ovat jokaisella sivulla samat: yhden linkin lisääminen vaatii seitsemän tiedoston muokkaamisen.

Parempi ratkaisu on koota yhteiset osat omiin tiedostoihinsa ja liittää ne automaattisesti. SSI-tekniikassa palvelin suorittaa dokumenttiin upotetut komennot ennen sivun lähettämistä selaimelle, joten selain saa aivan tavallisen HTML-sivun eikä tiedä koko asiasta mitään.

  1. Aloita uusi täysin tyhjä tekstitiedosto. Siihen ei tule doctypea, html-elementtiä eikä mitään muutakaan pohjaa — vain se katkelma, joka liitetään sivulle.
  2. Kopioi tähän tiedostoon Nanonanon etusivulla olevan <nav class="navbar">...</nav> -osan lähdekoodi kokonaisuudessaan, aria-label-attribuutti mukaan lukien.
  3. Muuta kaikki navigoinnin linkit puoliabsoluuttisiksi:

    <li><a href="/~omatunnus/www/artikkelit/">Artikkelit</a></li>
    Miksei suhteellinen viittaus käy?

    Sama tiedosto liitetään eri syvyyksillä oleville sivuille. Etusivulta artikkeleihin viitattaisiin muodossa artikkelit/, mutta kokkausartikkelista muodossa ../. Yhteen tiedostoon ei voi kirjoittaa molempia, joten viittausten on oltava samat riippumatta siitä, mille sivulle ne liitetään. Puoliabsoluuttinen viittaus alkaa palvelimen juuresta, joten se toimii kaikkialta.

  4. Tallenna tiedosto nimellä navbar.include hakemistoon W:\www\.
Vaihtoehto: base-elementti

Suhteellisia viittauksia voisi käyttää, jos jokaisen sivun head-osaan lisättäisiin heti ensimmäiseksi base-elementti, joka kertoo mihin osoitteeseen kaikki suhteelliset viittaukset suhteutetaan:

<base href="https://users.jyu.fi/~omatunnus/www/" />

Määritys koskee kaikkia sivun suhteellisia viittauksia: linkkejä, kuvia, tyylitiedostoja ja videoita. Juuri siksi se on hauras: yksi rivi muuttaa koko sivun viittausten merkityksen, ja vaikutus on helppo unohtaa. Tässä tehtävässä käytetään puoliabsoluuttisia viittauksia.

1.2 Sivut .shtml-päätteisiksi

  1. Muuta hakemistossa W:\www\ olevan index.html-tiedoston nimeksi index.shtml.

    JYU:n palvelimella SSI-komennot suoritetaan vain .shtml-päätteisistä tiedostoista. Tavallisesta .html-tiedostosta komennot eivät suoritu, vaan ne jäävät kommenteiksi eivätkä näy sivulla mitenkään. Tämä on tavallisin syy siihen, ettei SSI näytä toimivan.

  2. Korvaa sivulta koko nav class="navbar" -lohko SSI-komennolla:

    <!--#include virtual="/~omatunnuksesi/www/navbar.include" -->

    Komento näyttää HTML-kommentilta, mutta risuaita heti aloitusmerkinnän jälkeen tekee siitä palvelimen käskyn. Käytä aina virtual-parametria, joka tulkitsee polun www-osoitteena.

  3. Kokeile selaimella osoitetta https://users.jyu.fi/~omatunnus/www/. Navigoinnin pitäisi näkyä aivan normaalisti.

    Vain palvelimelta avattuna

    SSI toimii vain, kun sivu haetaan palvelimelta. Suoraan W:-asemalta tai file://-osoitteesta avattuna komennot jäävät suorittamatta ja navigointi puuttuu kokonaan.

  4. Varmista, että navigoinnin linkit toimivat. Voit kokeilla ne itse tai tarkistaa sivun W3C:n Link Checkerillä.
Huomaa mitä menetit

Aiemmissa ohjauksissa navigoinnista jätettiin nykyisen sivun kohta pelkäksi tekstiksi, jotta käyttäjä näkee missä on. Yhteisessä tiedostossa se ei enää onnistu: kaikki sivut saavat täsmälleen saman navigoinnin.

Tämä on SSI:n hinta, ja se on hyvä tietää. Nykyaikaisissa ratkaisuissa — sivustogeneraattoreissa ja sivupohjakielissä — liitettävälle osalle voidaan antaa parametreja, jolloin kukin sivu saa oman versionsa. Mieti, miten ratkaisisit asian, jos käytettävissä olisi vain SSI.

1.3 Muutosajankohta

  1. Siirrä alatunnisteen päivitysajankohta omaan p-elementtiinsä address-lohkon jälkeen.
  2. Korvaa käsin kirjoitettu päivämäärä SSI-komennoilla:

    <!--#config timefmt="%Y-%m-%d %H:%M" --><!--#echo var="LAST_MODIFIED" -->
    • config timefmt määrää päivämäärän muotoilun.
    • echo var="LAST_MODIFIED" tulostaa tiedoston muutosajankohdan.

    Palvelin lukee ajan tiedoston tiedoista, joten se pysyy oikeana ilman käsityötä.

  3. Kokeile selaimella, ilmestyikö muutosaika sivulle.
  4. Tee ohjaus3.css-tiedostoon asiayhteyden mukaan määräytyvä tyyli, joka siirtää alatunnisteen aikaleiman oikeaan laitaan tekijätietojen alapuolelle. Muista tarkistaa, miltä se näyttää kapealla näytöllä ja tummassa tilassa — nämä tehtiin ohjaus 5:ssä.

1.4 Tekijätiedot omaan tiedostoonsa

  1. Siirrä address-lohko omaan tiedostoonsa address.include.
  2. Liitä se alatunnisteeseen:

    <!--#include virtual="/~omatunnuksesi/www/address.include" -->
  3. Mieti

    Miksi päivitysajankohtaa ei voitu siirtää suoraan address.include-tiedostoon? Kokeile, jos et ole varma.

1.5 Hakemiston oletustiedosto

Palvelin etsii hakemistosta oletustiedoston siinä järjestyksessä kuin DirectoryIndex-direktiivissä on lueteltu. Jos hakemistossa on vielä vanha index.html, se voittaa uuden index.shtml-tiedoston, eikä mikään näytä muuttuneen.

  1. Avaa pääteyhteys palvelimelle halava.cc.jyu.fi.
  2. Siirry cd-komennolla www-hakemistoosi.
  3. Luo asetustiedosto:

    nano -w .htaccess
  4. Kirjoita tiedostoon:

    # Hakemiston oletustiedostot. Palvelin tarjoaa ensimmäisen, joka löytyy.
    DirectoryIndex index.shtml index.html
  5. Tallenna näppäimillä Ctrl+O ja poistu näppäimillä Ctrl+X.
Kolme asiaa .htaccess-tiedostosta

Lisää aiheesta Apache-luennon luvussa 1.

AddHandler-riviä ei tarvita

Vanhoissa ohjeissa .htaccess-tiedostoon lisätään rivit AddHandler server-parsed .html ja AddType text/html .html. Kumpaakaan ei tarvita, koska JYU:n palvelimella .shtml-pääte riittää.

Samoissa ohjeissa väitetään, että Apache jakaisi .shtml-tiedostot oletuksena text/xml-muodossa. Näin ei ole: .shtml on Apachen oletusmäärityksissä text/html.

1.6 Loput sivut

  1. Muuta samalla tavalla myös hakemistojen artikkelit, opiskelu, linkit ja galleria sivut: nimeä ne index.shtml-tiedostoiksi ja korvaa navigointi ja tekijätiedot SSI-komennoilla.
  2. Muista myös artikkelien alasivut artikkelit/it ja artikkelit/kokkaus.
  3. Varmista Link Checkerillä, että navigointilinkit toimivat kaikilta sivuilta.
  4. Kokeile nyt, mitä SSI antaa: lisää navigointiin yksi uusi kohta muokkaamalla pelkkää navbar.include-tiedostoa. Käy katsomassa kaikki sivut. Kuinka monta tiedostoa jouduit muokkaamaan?

Validoi palvelimelta, älä paikallisesti

.shtml-tiedosto ei ole paikallisesti kokonainen dokumentti: SSI-komennot ovat vielä kommentteina ja liitettävät osat puuttuvat, joten validaattori ilmoittaa virheitä joita ei ole. Käytä validaattorin Check by Address -vaihtoehtoa ja anna sille julkaistun sivun osoite. Silloin validaattori näkee saman kuin selain.

Liitettäviä tiedostoja (navbar.include, address.include) ei validoida lainkaan: ne eivät ole dokumentteja vaan katkelmia.

2. Salasanasuojaus

Hakemiston ja sen alihakemistot voi suojata salasanalla .htaccess-tiedostolla. Suojataan Nanonanon artikkelit.

Suojaus vaatii https-yhteyden

Basic-tunnistautuminen ei salaa salasanaa. Se lähetetään jokaisen pyynnön mukana vain Base64-koodattuna, mikä ei ole salausta vaan pelkkä esitystapa, ja kuka tahansa liikennettä kuunteleva saa sen selville. Suojaus on käyttökelpoinen ainoastaan https-yhteydellä, joka salaa koko liikenteen. users.jyu.fi on https-osoitteessa, joten tässä tehtävässä asia on kunnossa — mutta muista se muualla.

Älä myöskään käytä harjoituksessa mitään oikeaa salasanaasi.

2.1 Selvitä oikea polku

Tässä on tehtävän kinkkisin kohta. Samaan tiedostoon on kaksi eri polkua: se, jolla siihen pääsee komentoriviltä, ja se, jolla WWW-palvelin sen näkee. Ne eivät ole samat.

Sama tiedosto, kaksi polkua.
MihinPolku
Komentorivillä (cd, htpasswd) /autowebhome/home/omatunnus/public_html/… tai ympäristömuuttujan avulla /wwwhome$HOME/public_html/...
.htaccess-tiedostossa (AuthUserFile) /home/omatunnus/public_html/…

Väärä polku on ylivoimaisesti yleisin syy siihen, ettei suojaus toimi. Oireena on virhe 500, koska palvelin ei löydä salasanatiedostoa.

2.2 Luo salasanatiedosto

Tämä on luotava komentoriviltä eli avaa ssh-yhteys halava-koneeseen.

  1. cd html
  2. Tee w:-asemasi juureen hidden-kansio salasanatiedostoa varten

    mkdir hidden
  3. Siirry cd-komennolla hidden-kansioon
    cd hidden
  4. Luo tiedosto ja ensimmäinen käyttäjä. Valitsin -c luo uuden tiedoston ja pyyhkii olemassa olevan, joten seuraavia käyttäjiä lisätessäsi jätä se pois:

    htpasswd -c .htusers testi

    Komento kysyy salasanan kahdesti. Lisää käyttäjiä samaan tiedostoon näin:

    htpasswd .htusers toinen
  5. Anna palvelimelle lukuoikeus tiedostoon ja kansioon:

    chmod a+r .htusers
    chmod a+rx .
hidden-kansion ja salasanan luominen ympäristömuuttujan avulla

Tässä versiossa sinun ei tarvitse siirtyä cd-komennolla hidden-kansioon.

  1. Tee w:-asemallesi hidden-kansio salasanatiedostoa varten:

    mkdir -p /wwwhome$HOME/public_html/hidden
  2. Luo tiedosto ja ensimmäinen käyttäjä. Valitsin -c luo uuden tiedoston ja pyyhkii olemassa olevan, joten seuraavia käyttäjiä lisätessäsi jätä se pois:

    htpasswd -c /wwwhome$HOME/public_html/hidden/.htusers testi

    Komento kysyy salasanan kahdesti. Lisää käyttäjiä samaan tiedostoon näin:

    htpasswd /wwwhome$HOME/public_html/hidden/.htusers toinen
  3. Anna palvelimelle lukuoikeus tiedostoon ja kansioon:

    chmod a+rx /wwwhome$HOME/public_html/hidden
    chmod a+r /wwwhome$HOME/public_html/hidden/.htusers
Miksi tiedoston nimi alkaa pisteellä?

Salasanatiedosto joudutaan JYU:ssa sijoittamaan public_html-kansion alle, eli www-tilaan. Apachen oletusasetukset kuitenkin estävät .ht-alkuisten tiedostojen hakemisen selaimella, joten nimi .htusers on suojattu, kun taas nimi users olisi kenen tahansa luettavissa osoitteesta https://users.jyu.fi/~omatunnus/hidden/users.

Kokeile suojauksen jälkeen, mitä tapahtuu kun haet salasanatiedostoa selaimella. Vastauksen pitäisi olla 403.

2.3 Ota suojaus käyttöön

  1. Siirry suojattavaan kansioon ja luo sinne oma .htaccess-tiedosto:

    cd www/artikkelit
    nano -w .htaccess
  2. Kirjoita tiedostoon. Korvaa polku omallasi:

    AuthType Basic
    AuthName "Nanonanon artikkelit"
    AuthUserFile /home/omatunnus/public_html/hidden/.htusers
    Require valid-user
Direktiivien merkitys.
DirektiiviMerkitys
AuthType BasicKäytettävä tunnistautumistapa
AuthNameTeksti, joka näkyy selaimen kysymysikkunassa. Lainausmerkit ovat pakolliset, jos siinä on välilyöntejä
AuthUserFileSalasanatiedoston polku WWW-palvelimen näkemänä
Require valid-userKuka tahansa tiedostossa oleva käyttäjä pääsee sisään. Yksittäiset käyttäjät: Require user testi toinen

2.4 Testaa suojaus

  1. Avaa https://users.jyu.fi/~omatunnus/www/artikkelit/. Selaimen pitäisi kysyä tunnusta ja salasanaa.
  2. Kokeile väärää salasanaa. Mitä tapahtuu?
  3. Kirjaudu sisään ja avaa sitten yksityinen ikkuna ja kokeile samaa osoitetta. Selain muistaa tunnukset istunnon ajan, joten ilman yksityistä ikkunaa et näe suojausta uudelleen.

  4. Kokeile myös alihakemistoa artikkelit/it/. Suojaus vaikuttaa myös alihakemistoihin.
  5. Kokeile hakea salasanatiedostoa selaimella osoitteesta https://users.jyu.fi/~omatunnus/hidden/.htusers. Saat virheen 403.
  6. Validoi lopuksi HTML- ja CSS-koodit ja korjaa virheet. Muista käyttää Check by Address -vaihtoehtoa.

Tarkemmin hakemistojen suojaamisesta voi lukea digipalvelujen ohjeesta.

3. Lisätehtäviä

  1. Kokeile, mitä tapahtuu, kun poistat DirectoryIndex-rivin .htaccess-tiedostosta ja luot hakemistoon myös tiedoston index.html. Kumpi näytetään?

  2. Lisää murupolun logo omaksi liitettäväksi tiedostokseen. Miksi koko murupolkua ei voi liittää samalla tavalla kuin päänavigointia?
  3. Kokeile SSI-muuttujia DOCUMENT_NAME ja DATE_LOCAL:

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

    Mitä eroa on muuttujilla DATE_LOCAL ja LAST_MODIFIED? Kumpi pysyy samana, kun lataat sivun uudelleen?

  4. Suojaa galleria eri tunnuksella kuin artikkelit. Tarvitsetko toisen salasanatiedoston vai riittääkö Require user -rivin muuttaminen?

Käyttäjien kommentit

Kommentoi Lisää kommentti