Для удобства восприятия и запоминания ссылок людьми, а также, для seo оптимизации сайта под поисковые системы используют человеко-понятный URL (ЧПУ). Что представляют собой такие ссылки и как они выглядят? Обычный динамический GET-запрос выглядит следующим образом:

http://example.ru/?id_article=27

Человеко-понятный URL подразумевает приведение данной ссылки в адресной строке браузера к подобному виду:

http://example.ru/sozdanie_prostyh_chpu-ssylok.html

где sozdanie_prostyh_chpu-ssylok.html является не html документом, а динамически создаваемой страницей. Она так же может иметь другое расширение, не иметь расширения вообще или иметь символ «/» в конце строки и т.д. – это не имеет ровным счетом никакого значения. Все эти ссылки построены по одному и тому же алгоритму. Сам текст ссылки из адресной строки будет анализироваться в одном и том же файле index.php и в зависимости от параметров будет отображаться та или иная информация.

Создаем таблицы ссылок в MySQL

К примеру, мы создаем сайт, содержащий некоторые статьи. Создадим простую таблицу articles из 3-х полей, и добавим в нее несколько статей:

DROP TABLE IF EXISTS articles;
CREATE TABLE articles (
    article_id          int(11) NOT NULL auto_increment,
    article_name        varchar(255),
    article_seo         varchar(255),
  PRIMARY KEY (article_id)
);

Поскольку все ссылки, которые будут использоваться на нашем сайте, строятся динамически – нам необходимо иметь перечень этих ссылок. Для этого создадим таблицу links, которая будет содержать все существующие ссылки нашего сайта:

DROP TABLE IF EXISTS links;
CREATE TABLE links (
    link_id          int(11) NOT NULL auto_increment,
    link_seo         varchar(255),
  PRIMARY KEY (link_id)
);

Создаем основные файлы сайта

Для полноценной работы сайта нам понадобятся всего 3 файла – index.php, файл функций – lib.php и конфигурационный файл .htaccess. В конфигурационном файле добавим строки для перенаправления всех запросов в файл index.php. Т.е. любая ссылка (запрос) из адресной строки браузера будет анализироваться именно в этом файле.

AddDefaultCharset UTF-8
RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /?%{QUERY_STRING}

В lib.php создадим следующие функции: 1) соединение с базой данных, 2) выбор ссылки из базы ссылок и 3) отображение выбранной статьи.

<?php
    function connectDB() {
        $connect = mysql_connect('localhost', 'root', '');
        mysql_select_db('lessons', $connect);
        mysql_set_charset('UTF8', $connect);
        return $connect;
    }

    function selectRow($table, $column, $value) {
        $connect = connectDB();
        $result = mysql_query("SELECT * FROM $table WHERE $column = '$value'", $connect);
        mysql_close($connect);
        return mysql_fetch_assoc($result);
    }

    function getPageData() {
        $link = strtok($_SERVER['REQUEST_URI'], '?');
        if (selectRow('links', 'link_seo', $link)) return selectRow('articles', 'article_seo', $link);
        else {
            header ('HTTP/1.1 404 Not Found');
            return array('article_name' => '404. Not found.');
        }
    }
?>

Функция connectDB() создает подключение к базе данных, устанавливает кодировку UTF8 и возвращает указатель на это подключение. Вторая функция selectRow ($table, $column, $value) имеет три аргумента – это таблица, поле и само значение, с которым нужно сравнивать это поле. Выполняются следующие действия: установление связи с базой данных, выборка строки из указанной в аргументах таблицы, закрытие связи с базой данных и передача выбранной строки в виде ассоциативного массива.

И, наконец, третья функция getPageData() анализирует GET-запрос (начиная символом «/» и заканчивая символом «?», отсекающим параметры) и проверяет наличие такого запроса в таблице ссылок.
1) Если такая строка найдена, то мы выполняем следующие действия по формированию динамической страницы. В данном случае мы опять обращаемся к функции selectRow и выбираем нужную строку из таблицы статей и возвращаем ее.
2) В случае, если такая строка не найдена, мы возвращаем ответ, что такой страницы нет и код ошибки 404. Также, при передаче данной ошибки необходимо также передавать правильный код ответа (функция header).

И, наконец, создаем индексный файл сайта index.php.

<?php
	require_once "lib.php";
	$data = getPageData();
?>
<!DOCTYPE html>
<html>
<head>
	<title>SEO URL</title>
	<meta name="description" content="" />
	<meta name="keywords" content="" />
	<meta http-equiv="content-type" content="text/html" charset="utf-8" />
</head>
<body>
	<a href="/article_1.html" title="article">Статья 1</a>
	<a href="/article_2.html" title="article">Статья 2</a>
	<a href="/article_3.html" title="article">Статья 3</a>
	<a href="/article_4.html" title="article">Статья 4</a>
	<a href="/article_5.html" title="article">Статья 5</a>
	<?php echo "<h1>".$data[“article_name”]."</h1>"; ?>
</body>
</html>

Наш сайт готов. При вызове страницы, информация о которой есть в таблице links, на экране отобразится название статьи. Если же запрошена несуществующая страница – то отобразится сообщение об ошибке 404. Обращаю внимание, что подключение библиотеки и обращение к функциям должны находиться в самом начале файла, поскольку функция header обязана вызываться до отправки любого вывода: нормальными ли тэгами HTML, пустыми строками в файле или из PHP.

Таким способом, Вы можете создавать ссылки любого вида. С помощью хранения ссылок в отдельной таблице Вы с легкостью сможете создать карту сайта для поисковых систем. Каждый инструмент SEO оптимизации играет важную роль и повышает ранжирование сайта в поисковых запросах.