Pikkuinen opas htaccess-kikkailuun

Pikkuinen opas htaccess-kikkailuun

Viesti Magic Eye 04 Huhti 2007 17:06

Htaccessilla voi tehdä vaikka mitä palvelimeen liittyvää, esimerkiksi muuttaa tiedostojen osoitetta helpommin luettavaksi, estää pääsy sivustoon tai sen osiin tietyiltä IP-osoitteilta, estää hotlinkkauksen eli "kaistanvarastamisen" ja piilottaa tiedostolistauksesta tiettyjä tiedostoja. Jotta pystyisit käyttämään kaikkia htaccessin tarjoamia ominaisuuksia, palvelimesi pitäisi olla Apache. Ohjeet Apachen asentamiseen löytyy täältä.

Htaccess on oikeastaan helppoa: teet vain Muistiolla (tai jollain muulla tekstieditorilla) tiedoston jonka nimeksi annetaan .htaccess ja kirjoitat itse koodin tähän tiedostoon. Jos esimerkiksi haluat htaccess-tiedoston, jonka sisälle tulee "deny from all" (ilman lainausmerkkejä), niin ruutusi pitäisi näyttää tältä: Kuva

Jos olet jo aiemmin leikkinyt htaccessilla, olet saattanut huomata, ettei htaccess-tiedostoja voi katsella selaimessa. Yleensä kaikki ".ht" - merkkijonolla alkavat tiedostot piilotetaan valmiiksi muilta, mutta jos näin ei ole, sen voi korjata todella helposti lisäämällä tämän sivusi pääkansion (yleensä public_html) htaccess-tiedostoon:
Koodi: Valitse kaikki
<Files ~ "\.ht">
   deny from all
</Files>


Edellinen koodi yksinkertaistettuna piilottaa selaimelta kaikki tiedostot, joiden nimi alkaa merkkijonolla ".ht" ja generoi virhekoodin 403.


Pääsyn estäminen

Aiempi esimerkki näyttää, miten voi estää pääsyn yhteen tiedostoon, mutta miten estää pääsy tiettyyn kansioon vain tietyiltä IP-osoitteilta? Näin:
Koodi: Valitse kaikki
order deny, allow
#määritellään järjestys, ettei vahingossa deny salli pääsyä ja allow estä sitä.

deny from ip.tähän.xxx
#estetään tietty ip-osoite


Mutta entä jos haluat olla ainoa henkilö, joka pääsee käsiksi tiedostoihin? Vaikka näin:
Koodi: Valitse kaikki
order deny, allow
# ...

allow from ip-osoitteesi.tähän.xxx.yyy.zzz
#sallii pääsyn sinun osoitteestasi

deny from all
#estetään pääsy kaikilta ip-osoitteilta


Ylläoleva on kätevää jos sinulla on esimerkiksi kansio, jossa on tuleva huippusalainen projektisi, jota vain sinä saat testata kunnes se on valmis.




Osoitteiden siistiminen

Oletko joskus törmännyt osoitteeseen, joka on tyyliä http://www.sivusto.com/hilavitkuttimet/vari/punainen/valmistaja/harrin-neonvihreat/? Tällainen on todella helppo tehdä:
Koodi: Valitse kaikki
RewriteEngine On
Options +FollowSymLinks


rewriterule ^hilavitkuttimet/vari/([^/]*)/valmistaja/([^/]*)/$ hilavitkuttimet.php?vari=$1&valmistaja=$2


Jo et ole ennen tällaista tehnyt, et varmaankaan tajua tuosta höykäsen pöläystä, joten selitetäänpä vähän:
  1. RewriteEngine On asettaa URL-osoitteiden uudelleenkirjoittamisen päälle.
  2. Options +FollowSymLinks sallii symboliset linkit.
  3. rewriterule ^hilavitkuttimet/vari/([^/]*)/valmistaja/([^/]*)/$ hilavitkuttimet.php?vari=$1&valmistaja=$2 kirjoittaa URL-osoitteen mukavempaan muotoon. Kaikki "siansaksa" sulkumerkkien sisässä ovat säännöllisiä lausekkeita, ja ilman sulkuja näitä tekstinpätkiä ei "työnnettäisi" muuttujaan. Edellinen koodi siis yksinkertaisesti avaa hilavitkuttimet.php-nimisen tiedoston mutta näyttää sen selaimen osoite-laatikossa eri nimellä. Kuitenkin kaikki tiedot voidaan lähettää PHP:lle helposti.



Vielä yksinkertaisempi esimerkki:
Koodi: Valitse kaikki
rewriterule ^(.*)\.html$ $1.php [nc]


Tämä lähettää kaikki pyynnöt mikälie.html-tiedostosta mikälie.php-tiedostoon. Käytännössä kaikki php-päätteiset tiedostot ovat nyt mahdollista selata myös html-päätteellä.




Sekalaista

Tässä on sitten kaikenlaista sekalaista htacces-sälää. En ole pitemmin selitellyt näitä, vaan pelkästään kommentoinut.


Hotlinkkauksen esto
Koodi: Valitse kaikki
rewritecond %{HTTP_REFERER} !^$
#varmistetaan että edellinen sivu on olemassa

rewritecond %{HTTP_REFERER} !^http://(.*)\.sivusi\.com/ [nc]
#jos edellinen sivu, joka pyytää kuvaa on jokin muu kuin sinun sivusi...

rewriterule .*\.(jpe?g|gif|bmp|png|wbmp)$ http://www.sivusi.com/hotlink.gif [nc]
#...korvataan pyydetty kuva jollain muulla kuvalla.



Siistimpi 404-virhesivu
Koodi: Valitse kaikki
rewritecond %{REQUEST_FILENAME} !-f
#jos nykyinen osoite ei ole olemassa oleva tiedosto...

rewritecond %{REQUEST_FILENAME} !-d
#...tai kansio...

rewriterule .* http://sivusi.com/404.php
#...korvataan osoite 404-dokumentilla.


404.php voisi näyttää tältä:
Koodi: Valitse kaikki
<h1><?= end (   explode (   "/", $_SERVER["REQUEST_URI"]   )   ); ?>-nimistä tiedostoa ei löydy.</h1>



Www-alku pois
Koodi: Valitse kaikki
rewritecond %{HTTP_HOST} ^www\.sivu\.com [nc]
#katsotaan, onko osoitteessa www sisällä

rewriterule ^(.*)$ http://sivu.com/$1 [nc,r]
#jos on, korvataan se.



Tietyn tiedoston sisällyttäminen automaattisesti
Koodi: Valitse kaikki
php_value auto_prepend_file tiedosto-ennen.html
#tiedosto, joka lisätään jokaisen tiedoston alkuun

php_value auto_append_file tiedosto-jalkeen.html
#tiedosto, joka lisätään jokaisen tiedoston loppuun





Tässäpä tämä pienimuotoinen opas, toivottavasti tästä oli jollekin hyötyä. Jos oppaassa on virheitä tai jokin ei toimi tai jäi epäselväksi, niin kysy vaan.
Käyttäjän avatar
Magic Eye
 
Viestit: 481

Viesti Evilman 04 Huhti 2007 17:55

Joka päivä oppii jotain uutta. Mielestäni tämä on aivan mahtava, juuri ajankohtainen. Kiitos!
Evilman
 
Viestit: 673

Palaa alueelle Ohjelmointioppaat