Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: ?page ohjailu

Sivun loppuun

mansikka [09.11.2012 11:39:48]

#

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?

Ripe [09.11.2012 12:53:43]

#

Luullakseni näin:

RewriteEngine On
RewriteRule ^/([^/\.]+)/?$ index.php?page=$1 [L]

.htaccess pitää laittaa juureen

Lebe80 [09.11.2012 13:38:02]

#

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.

mansikka [09.11.2012 14:01:36]

#

Ripen koodin lisäilin .htaccess tiedostoon mutta eipä tunnu toimivan kun koitan kirjoittaa www.url.com/etusivu

not found

qeijo [09.11.2012 14:39:48]

#

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

mansikka [09.11.2012 14:52:30]

#

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.

Macro [09.11.2012 15:45:42]

#

$file -> $page

The Alchemist [09.11.2012 15:45:57]

#

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);
// $data-muuttujan käyttö

$_VIEW = 'my_app/views/CONTROLLER/ACTION.php';

// Purkaa taulukossa olevat indeksit muuttujiksi:
// [ 'a' => 1, 'b' => 2] -> $_a := 1 ja $_b := 2
extract($data, EXTR_PREFIX_ALL, '');
require $_VIEW;

mansikka [03.12.2012 13:13:29]

#

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 :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta