Искал как сделать чпу, в итоге написал сам. Через пару часов наткнулся на готовы вариант от любителя-профессионала.
Собственно вопрос какой вариант лучше выбрать?по быстродействию
по нагрузки
по защите
Я думаю что мой вариант хоть и по новее, но проиграет.
<?php
class Router {
private $_route = array();
public function setRoute($dir, $file) {
$this->_route[trim($dir, '/')] = $file;
}
public function route() {
if (!isset($_SERVER['PATH_INFO'])) {
include_once 'index.html';
} elseif (isset($this->_route[trim($_SERVER['PATH_INFO'], '/')])) {
include_once $this->_route[trim($_SERVER['PATH_INFO'], '/')];
}
else return false;
return true;
}
}
$route = new Router;
$route->setRoute('page/name', "1.html");
$route->setRoute('page-2', "2.html");
$route->setRoute('post', "3.html");
if (!$route->route()){echo '404';}
htaccess
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
Скрипт не дописан, решил упростить и поэтому без базы.
Если он лучше подходит то продолжу его дописывать, базу просто подключить)
И собственно найденный скрипт
<?php
$mysqli = new mysqli("localhost", "root", "", "lesson-local");
function replaceSEF($content) {
global $mysqli;
$regex = "[(<a[^>]*href\s*=\s*[\"'])([^'\"]*)([\"'][^>]*>\s*.*?\s*</a>)]i";
preg_match_all($regex, $content, $matches);
for ($i = 0; $i < count($matches[2]); $i++) {
$temp = str_replace("&", "&", $matches[2][$i]);
$result_set = $mysqli->query("SELECT `alias` FROM `sef` WHERE `link`='$temp'");
$row = $result_set->fetch_assoc();
$content = str_replace($matches[2][$i], $row["alias"], $content);
}
if ($result_set) $result_set->close();
return $content;
}
function getContent($alias) {
global $mysqli;
$content = "Моя страница <a href='/?view=article&id=1'>тут</a> и ещё вот <a href='/?view=section&id=1'>это</a>";
$result_set = $mysqli->query("SELECT `link` FROM `sef` WHERE `alias`='$alias'");
$row = $result_set->fetch_assoc();
if ($result_set) $result_set->close();
$vars = parse_url($row["link"]);
parse_str($vars["query"], $vars);
if ($vars["view"] == "article") $content .= "<br />Статья с ID=".$vars["id"];
elseif ($vars["view"] == "section") $content .= "<br />Раздел с ID=".$vars["id"];
else $content = "404 Not Found";
return $content;
}
$content = getContent(substr($_SERVER["REQUEST_URI"], 1));
echo replaceSEF($content);
$mysqli->close();
?>
htaccess
AddDefaultCharset UTF-8
RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /?%{QUERY_STRING}
Он уже готовый и работает с базой