php,mysql, Reg_exp : http://go.pyatnitsev.ru или удобная навигация

Мне сильно понравилась мысль коротких ссылок на сайтах. Нет, это не сервисы как bit.ly или goo.gl, а страницы переадресации внутри домена. Таковые есть у Microsoft, Intel. Нужны, чтобы их можно было легко запомнить и раздать клиентам, для их же удобства.

Захотелось сделать такую же страничку. Сделал. Дело было так:

Иду и создаю поддомен http://go.pyatnitsev.ru, пока он развертывается, начинаю продумывать структуру базы и php-кода, который этим занимался бы.

MySQL

Начал с базы, которая у меня уже есть. Создал в ней таблицу на 4 колонки:

  1. id — уникальный идентификатор или первичный ключ, в реляционных базах должно быть хотя бы одно уникальное поле.
  2. hash_key — Хеш ключа. Ключ, это то, что введет пользователь. Я хочу брать от него хеш, что бы не париться с блокированием попыток взлома, так как все символы превращаются в единую строку. Далее вопрос — какой хеш брать? MD5 уже устарел, так что буду брать SHA1.
  3. word — это по-сути своей комментарий, который я буду вносить, чтобы было понятно, что за слово было внесено в таблицу.
  4. url — адрес в полном виде, на который нужно перенаправлять.

Таблица получилась. Осталось ее заполнить. Первое, что добавляю, ссылку на этот блог (ключевое слово blog) и для проверки работы еще на свою страницу вконтакте (параметр vk).

PHP

Теперь хорошо бы написать скрипт, который бы это всё обрабатывал.

Чего нужно добиться? Что бы скрипт выбирал от параметра,который ему будет передан, запись из базы и переходил по url, который там обозначен.

1
2
$query = "SELECT `url` FROM `db_name` WHERE `hash_key` = '". sha1($_GET['go']) ."' LIMIT 1";
$sql = mysql_query($query) or die('Error with Query');
$query = "SELECT `url` FROM `db_name` WHERE `hash_key` = '". sha1($_GET['go']) ."' LIMIT 1";
$sql = mysql_query($query) or die('Error with Query');

Создаем строку запроса и выполняем ее.

Далее проверяем вернулось ли нам что-нибудь из базы? Если да — преобразуем представление данных в ассоциативный массив. Далее перенаправляем пользователя на страницу из базы и обрываем выполнение скрипта в целях безопасности. Если же ничего похожего в базе не нашлось (пользователь указал несуществующий ключ или не указал ничего) перенаправляем на главную страницу домена  — на этот блог.

if (mysql_num_rows($sql) > 0)
{
$row = mysql_fetch_assoc($sql);
header(‘Location: ‘ . $row[‘url’]);
exit;
}
else
{
header(‘Location: http://pyatnitsev.ru’);
die;
}

На этом этапе сервис уже работает, но работает некрасиво.

принимая ссылки вида»http://go.pyatnitsev.ru/?go=key«, некрасиво. Хочется чтобы было что-то вроде «http://pyatnitsev.ru/key«. Это можно сделать через mod_rewrite веб-сервера Apache. Создал конфигурационный файл сервера .htaccess и поместил в него такой код:

RewriteEngine On
RewriteBase /
RewriteRule ^([a-zA-Z0-9_-]+)$ go.php?go=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ go.php?go=$1

Первая строка включает перенаправление url. RewriteBase / — задает основной домен.

RewriteRule ^([a-zA-Z0-9_-]+)$ redir.php?go=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ redir.php?go=$1

Это 2 правила переадресации. Сначала идет регулярное выражение, которое формирует новый, красивый адрес, потом идет описание оригинального адреса.

Теперь всё красиво. Тестируйте, если будут ошибки (особенно влияющее на безопасность — пишите)

1 Response

  1. Pyatnitsev 11.12.2011 / 03:22

    Не великое изменение функционала.
    Дело в том, что на данный момент пользователь написавший что-то с точной в ключе скажем go.pyatnitsev.ru/go.microsoft получит ошибку 404 — файл не найден. Что бы это устранить внес правку в .htaccess, добавив строчки:

    <br /> ErrorDocument 404 /go.php<br /> ErrorDocument 403 /go.php<br /> ErrorDocument 500 /go.php<br />

    В таком случае он перенаправит на страницу по-умолчанию.

Добавить комментарий