Koitin tuossa mod_rewritellä tehdä urleista "siistimpiä" mutta eihän siitä mitään tullut.
Itselläni on käytössä index.php:ssä
<?php $page = strip_tags($_GET["page"]); ?> <?php $page = isset($page) ? $page : "etusivu"; $file = "sivut/".preg_replace("@[^a-zA-Z0-9]@", "", $page).".php"; if (!file_exists($file)) { $file = "sivut/etusivu.php"; } include($file); ?>
ja urlit ovat nyt sitten muotoa www.url.com/?page=etusivu
Haluaisin urlit muotoon www.url.com/etusivu/
Eli mitä tuonne .htaccess tiedostoon pitäisi kirjailla että homman saisi pelittämään?
Kaikki vinkit otetaan vastaan.
Lisäksi vielä kysymys, tuleeko .htaccess tiedosto luoda sinne juureen missä index.php on vai tuonne /sivut/ kansioon?
Luullakseni näin:
RewriteEngine On RewriteRule ^/([^/\.]+)/?$ index.php?page=$1 [L]
.htaccess pitää laittaa juureen
Ja osoitteet eivät tietenkään tämänkään jälkeen muutu php/html-sivuistasi tuohon muotoon, vaan sinun pitää muuttaa siis linkit (php/html:n joukosta) tuohon "selkokieliseen" muotoon.
Ripen koodin lisäilin .htaccess tiedostoon mutta eipä tunnu toimivan kun koitan kirjoittaa www.url.com/etusivu
not found
Olisi hyvä heittää 404 herja jos sivua ei löydy, nyt myös kaikki paskalinkit johtavat "oikealle" sivulle (etusivu.php).
Tämä ei ole hyvä asia esim. SEO:ta ajatellen.
Lisäksi toi strip_tags - on turha, preg_replace - funktion voisit korvata basename:lla.
Lopuksi file_exists tarkistaa onko sen nimistä tiedostoa tai hakemistoa olemassa.
Is_file tarkistaa pelkästään onko kyseistä tiedostoa olemassa.
$page = isset($page) ? $page : "etusivu"; $file = $pagedir . basename($page) . ".php"; if (!is_file($file)) { header('HTTP/1.0 404 Not Found'); $file = $pagedir . "virhesivu.php"; } include($file);
Jeps eli : $file -> $page
Tolla strp_tagsilla alunperin oli tarkoitus estää minkä tahansa urlin kirjoittaminen / includaaminen mutta en tiedä olenko sitten ymmärtänyt myöskään tuota strip_tags komentoa oikein...
Lisäys: Geijo, mitä modifikaatioita tuohon sinun pätkääsi tarvitaan, tuollaisenaan ei ainakaan toiminut minun sivupohjassa. Palauttaa tyhjän sivun.
$file -> $page
Esittelenpä tässä oman toimintamallini, joka on lainattu Zend Framework 2:n mallisovelluksesta. Eli siis urli ohjataan muokkaamattomana php:lle, jonka päässä itse parsitaan siitä kaikki haluttu tieto. Mallissani on ajateltu niin, että kaksi ensimmäistä osaa määräävät kutsuttavan metodin, loput voivat olla mitä tahansa parametreja, joita suoritettavassa metodissa tarvitaan.
$controller-muuttujaan tallennettava arvo määrittäisi mvc-mallin mukaisen ns. controllerin ja $action-muuttujan arvo taas controllerissa olevan metodin. Controller voi olla olio-ohjelmoinnin sääntöjen mukaisesti luokka ("MyApp\Controller\MyController") tai vaikka tavallinen php-skriptitiedosto ("my_app/controllers/my_controller.php"). Valitun paradigman mukaan myös määräytyy se, onko $action-muuttujan osoittama funktio luokan public-jäsenmetodi vai tavallinen funktio.
*** .htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L]
*** index.php <?php $url = $_SERVER['REQUEST_URI']; $root = dirname($_SERVER['SCRIPT_NAME']); $query = substr($url, strlen($root) + 1); if (strlen($_SERVER['QUERY_STRING']) > 0) { $query = substr($query, 0, -1 * strlen($_SERVER['QUERY_STRING']) - 1); } $params = explode('/', $query); $controller = array_shift($params); $action = array_shift($params); if (!$action) { $action = 'index'; } exit("Called method '{$action}' on module '{$controller}'.");
*** index.php (jatkuu, vaihtoehto 1) $file = basename($file); $action = $action . '_action'; require 'my_app/controllers/' . $file . '.php'; if (!is_function($action)) { header('HTTP 404 Not Found'); exit; } $data = call_user_func($action, $params);
*** index.php (jatkuu, vaihtoehto 2) $controller = 'MyApp\\Controller\\' . $controller; $action = $action . '_action'; $class = new $controller(); $program = array($class, $action); $data = call_user_func($program, $params);
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?page=$1
Tuollaisella pätkällä alkoi toimimaan nyt nuo urlit niin kuin halusin.
qeijo kirjoitti:
Lisäksi toi strip_tags - on turha
Tuohon tarvitsisin sitten vielä jotain ohjetta että miten tosiaan estetään se että ei ihan mitä tahansa pysty ajamaan urlista.
Lisäksi se 404 -virhesivu on vielä puukottamatta tuohon ja senkin kanssa tarvitsisin apua. Oma osaaminen php:n kanssa on erittäin huonoa. Ja haluaisin käyttää kuitenkin tuota alkuperäistä skriptaa. Eli miten tuohon lisättäisiin se 404 sivu? Tällä hetkellähän jos sivua ei löydy näytetään etusivu.
Lisäys: Sainkin homman toimimaan :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.