Pieni koodibinkki siitä, miten saada sivut dynaamisiksi ja samalla linkit siisteiksi ilman mod_rewrite:a. Koodivinkki koodattu käyttäen OOP:ta. Vaatii PHP5:n toimiakseen.
Skripti toimii näin. Uuden sivun saa luomalla tämän sivun nimisen kansion ja samannimisen sisältötiedoston .pages-kansioon (tai mihin tahansa kansioon, jonka itse määrittelet skriptissä).
Esim. Palvelimen julkisen osan juuressa, (tai siinä, jonka annoit muuttujalle $inetpub arvoksi) oleva index.php ($inetpub/index.php) on aina automaattisesti etusivu (tai minkä tahansa muun määrittelemäsi niminen). Kansiossa $inetpub/sivunnimi/ oleva index.php taas saa sisällökseen kansionsa nimisen tiedoston sisällön ($inetpub/.pages/sivunnimi).
Uusi sivu luodaan siis luomalla uuden sivun niminen kansio ja luomalla sinne index.php, joka lisää itseensä julkisen osan juuressa olevan index.php:n. Näin linkit saadaan muotoon "http://www.domain.com/sivunnimi/" muodon "http://www.domain.com/?sivu=sivunnimi" sijasta.
Ja tätä vinkkiähän voi soveltaa. ;P Kysykää, jos jokin kohta jäi epäselväksi. Muistakaa muuttaa index.php:n tiedot omaa järjestelmää vastaaviksi.
Koodi testattu toimivaksi omassa järjestelmässä.
<?php // Tarvittavat, lisättävät tiedostot: require_once '/home/tunnus/wwwroot/includes/pageclass.php'; // Palvelimen julkisen osan juuri sekä skriptin tiedostonimi ja polku. $inetpub = '/home/tunnus/wwwroot/public_html'; $script_name = getcwd() . '/index.php'; // Luodaan sivusta objekti ja näytetään sivu. $page_obj = new Page($script_name, $inetpub); /* Jätetään loput parametrit oletuksiksi (etusivutiedoston nimi jne.). */ $page_obj->display(); ?>
<?php class Page { /** * Luokkamuuttujat */ // Privaatit private $_isPage = false; /* Sisältää tosi/epätosi, riippuen onko sivua olemassa (alkuarvo epätosi, bool). */ private $_pTmpName; /* Sisältää väliaikaisen sivunnimen (tarkistusta varten, string). */ // Julkiset public $frontPageName; // Sisältää etusivutiedoston nimen. public $nfPageName; // Sisältää ei löytynyt -tiedoston nimen. public $pagesDir; /* Sisältää sivujen sisälttötiedostojen kansion nimen. */ public $pContent; // Sisältää sivun sisällön (string). public $pName; // Sisältää sivun nimen (string). public $pagesList = null; // Sivulistan alustus (mixed, string). public $inetPub; /* Sisältää palvelimen julkisen osan juuren polun (string). */ /** * Luokan konstruktori */ public function __construct($scriptName, $inetPub, $frontPageName = 'etusivu', $nfPageName = 'notfound', $pagesDirname = '.pages', $nfPageName_str = '[[notfoundpagename]]') { // Viedään palvelimen julkisen osan juuri luokkamuuttujaan. $this->inetPub = $inetPub; // Etusivutiedoston nimi. $this->frontPageName = $frontPageName; // Ei löytynyt -tiedoston nimi. $this->nfPageName = $nfPageName; // Kansio, jossa sivujen sisältötiedostot ovat. $this->pagesDir = "$inetPub/$pagesDirname"; /* Siinä tapauksessa, että sivua ei ole, on näytettävä sivu, joka kertoo että sivua ei löytynyt. Tämä muuttuja määrää, minkälainen kohta tekstistä korvataan ei-löytyneen sivun nimellä. */ $this->nfPageName_str = $nfPageName_str; /* Jos skriptinnimi (polku + tiedostonimi) on juuressa oleva index.php, on sivu etusivu. */ //echo "$inetPub/index.php $scriptName "; if ($scriptName == "$inetPub/index.php") { $this->_setPage($this->frontPageName); // Muuten tarkastetaan, onko sivua. Jos on, ladataan vastaava sivu. } else { $this->_pTmpName = substr( $scriptName, (strlen($inetPub) - 1), (strlen($scriptName) - 1) ); /* Jos sivu on olemassa, asetetaan se sivuksi. Muuten sivuksi ei löytynyt -sivu. */ ($this->_isPage()) ? ($this->_setPage($this->pTmpName)) : ($this->_setPage($this->nfPageName)); } } /** * Metodi, jolla sivu lopulta näytetään: * $pobject->display(); * * Tee täällä kaikki mahdollinen käsittely näytettävän sivun html:lle. */ public function display() { /* Jos sivua ei löytynyt, korvataan $this->nfPageName_str -muuttujan mukainen kohta notfound-sivusta löytymättömän sivun nimellä */ if ($this->pName == $this->nfPageName) { $this->pContent = str_replace( $this->nfPageName_str, $this->_pTmpName, $this->pContent ); } echo $this->pContent; } /** * Privaatti metodi _setPage() Asettaa luokkamuuttujan pName arvon ja * lataa sivun sisällön luokkamuuttujaan pContent. */ private function _setPage($pageName) { $this->pName = $pageName; $this->pContent = $this->_loadPage(); } /** * Privaatti _isPage() tarkastaa, onko sivua olemassa */ private function _isPage() { // Kerätään kaikki sivut (tiedostot) taulukkoon. $this->pagesList = glob("$this->pagesDir/*"); /* Käytetään tilapäistä ptmpName-muuttujaa (pName, ennen tarkistusta, onko sennimistä sivua olemassa). */ $this->_pTmpName = explode('/', $this->_pTmpName); $this->_pTmpName = $this->_pTmpName[(count($this->_pTmpName) - 2)]; /* Käydään pagesList-taulukko läpi silmukassa ja muunnetaan sen alkiot niin, että niiden arvoina on pelkkä sivunnimi (poistetaan polku ja tiedostonimi niin, että viimeisen kansion nimi jää alkion arvoksi. */ $plcount = count($this->pagesList); for ($i = 0; $i < $plcount; $i++) { if (!is_dir($this->pagesList[$i])) { /*$this->pagesList[$i] = explode('/', $this->pagesList[$i]); $this->pagesList[$i] = $this->pagesList[$i][ (count($this->pagesList[$i]) - 1) ];*/ // Yksinkertaisempi tapa $this->pagesList[$i] = basename($this->pagesList[$i]); } } // Jos annettu nimi on olemassa, palautetaan tosi (true). if (in_array($this->_pTmpName, $this->pagesList)) { $this->_isPage = true; return true; } // Muutoin epätosi (false). return false; } /** * Privaatti _loadPage() palauttaa sivun sisällön tiedostosta */ private function _loadPage() { return file_get_contents("$this->pagesDir/$this->pName"); } } ?>
Jos tämänkaltaisesta systeemistä haluaa vaivattoman, niin jokin FTP-luokka kehiin ja sen voimin voi luoda/poistaa hakemistot ja tiedostot. Eli sivumuokkain saa hoitaa hommat. Omin voimin FTP:llä sörkkiminen joka välissä on kuitenkin kauhean vaivalloista.
FTP-luokan etuhan on ehdottomasti se, että tiedostojen oikeudet menevät oikein, PHP:n kautta tiedostoja luodessa tiedostoille tulee eri oikeudet ja jotkin palveluntarjoajat voivat rajoittaa näitä merkittävästi. FTP toimii varmasti.
Ymmärsinkö nyt oikein? Ton esimerkin mukaan siis pitäis olla seuraavat tiedostot ja kansiot:
.../public_html/index.php
.../public_html/sivunnimi/index.php
.../public_html/.pages/sivunnimi/sivunnimi (tiedosto)
Tuohon sivunnumi (tiedostoon) pitäisi siis laittaa jotain tekstiä.
Kaiken tämän jälkeen saat sivun näkyviin, kun kirjoitat osoiteriville domainisi.fi/sivunnimi...
Miksei voisi suorilta laittaa tuota sivunnimi-kansiota tuohon public_html:n juureen, ja sivu toimisi täsmälleen samalla lailla?
IIS:ään on saatavilla mod_rewriteä pitkälti vastaava ja samaan tapaan toimiva ratkaisu, ISAPI_Rewrite. Täysversio on maksullinen, mutta ilmainenkin versio löytyy ja se on täysin riittävä yhtä tai vaan paria sivustoa koneellaan pyörittävälle. Täysversio tukee hakemistoista löytyviä .htaccess-tiedostoja.
Mites helvetissä tän saa toimimaa?
Joku ohje ois voinu olla paikallaa
Aihe on jo aika vanha, joten et voi enää vastata siihen.