<rmcreative>

RSS

Красивые адреса на сайте

27 ноября 2005

Небольшое введение.

В последнее время стало модно делать на сайте понятные URL, т.е. не /index.php?mod=news&day=22, а /news/22/. Всё началось с нескольких больших компаний, чьи специалисты поняли, что продвинутые пользователи кроме навигации по ссылкам часто набирают адрес странички вручную. С тех пор программисты и веб-мастеры придумали множество способов достижения такой красоты. Часть их мы для начала и рассмотрим.

Способ 1. В лоб.

Вспомните, как обозначаются папки сайты в адресной строке. Вспомнили? Правильно. Вот так: /адрес_сайта/папка/. А теперь вспомним, что когда мы набираем адрес сайта, то на самом деле отображается файл index.html (или другой индекс), но при этом ведь в строке адреса он не указан!

Вот вам и первый способ: создаём папку и засовываем в неё index.html.

Теперь ваша страничка с обзором любимой книги с адресом /book.html будет доступна по адресу /book.

Нам не пришлось дополнительно ничего писать, но зато придётся создавать кучу папок и не удастся красиво передать параметры. Будет не то, что надо, а что-то вроде /book?name=fight_club.

Способ 2. Небольшая настройка Apache.

Можно настроить сервер Apache так, чтобы при наборе имени файла без расширения он искал наиболее похожий файл. Таким образом, можно избежать создания папок. Необходимость в создании кучи папок отпадает, но остаётся нерешенным вопрос с передачей параметров. К тому же сервер может найти совсем не тот документ, который нужен вам.

Способ 3. Файлы без расширения.

Ещё один трюк - сделать исполняемыми файлы без расширения:


ForceType application/x-httpd-php

Таким образом, хоть мы и не получим красивой передачи параметров, но зато избавимся от проблемы с поиском файлов. Минусом этого подхода является некое неудобство работы с такими файлами.

Способ 4. С использованием ошибок.

Если написать в .htaccess нижеследующие строчки, то все запросы к несуществующим файлам будут отдаваться на обработку скрипту index.php.

ErrorDocument 404 index.php
ErrorDocument 403 index.php
ErrorDocument 401 index.php

В самом скрипте можно получить введённый адрес из переменной $REQUEST_URI, в зависимости от него выполнить нужный код. В случае получения странички необходимо послать заголовок:

header('HTTP/1.0 200 Ok');

На самом деле подобную обработку адреса можно прицепить ко всем вышеописанным способам, но есть одно большое но - придётся писать довольно много кода для обработки адреса, что само по себе напрягает даже опытного программиста.

Неужели нет способа проще?

Способ 5. Лекарство от всех бед.

Теперь приступим к тому, ради чего собственно и затевалась данная статья.

При написании движка RMCreative я решил, что надо использовать красивые адреса. Как представитель ленивых программистов я не хотел изобретать велосипеда и принялся искать информацию об их создании. К сожалению, все уже описанные методы (а их гораздо больше, чем привёл я в начале статьи) мне не понравились. Или много писать, или мало получишь.

В одной из статей, написанной Дмитрием Лебедевым, рассматривались некоторые возможности модуля Apache mod_rewrite, но применялись его возможности всё по той же схеме, описанной в четвёртом способе. Я же нашел ему более рациональное и простое применение.

Итак, что же такое этот mod_rewrite?

mod_rewrite - модуль сервера Apache, который использует 90% всех хостингов, добавляющий возможность предварительной обработки и перенаправления запросов. Для его использования удобно воспользоваться файлом .htaccess.

Для начала включаем модуль: RewriteEngine On

Затем пишем правила: RewriteRule исходныйадрес адресназначения

Когда мы обратимся по адресу http://example.com/исходный_адрес/, то на самом деле сервер обратится к http://example.com/адрес_назначения/.

Небольшой пример
RewriteEngine On

RewriteRule news/ news.php
RewriteRule files/book/ files.php?id=book
Но это ещё не всё!

Самая главная возможность mod_rewrite - использование регулярных выражений!

Если вы ещё не знакомы с регулярными выражениями, рекомендую с ними познакомиться до дальнейшего изучения данной статьи. На первый взгляд они представляют собой жуткий бред, но при детальном рассмотрении оказываются самым мощным инструментом для работы со строками.

Статьи про регулярные выражения:

[Синтаксис](http://ru2.php.net/manual/ru/reference.pcre.pattern.syntax.php) [Общее описание, список функций и полезные комментарии](http://ru2.php.net/manual/ru/ref.pcre.php) [Статья Дмитрия Бородина](http://php.spb.ru/regular_expression.html)

Допустим, мы написали скрипт, который выводит из указанного файла некую статью и вызывается из адресной строки так:

[showarticle.php?article=programming/php/goodurl](#)

Мы же хотим получить что-то вроде:

[article/programming/php/goodurl](#)

Нет проблем! Пишем в наш .htaccess:

RewriteEngine On

RewriteRule ^article/([^.]*)[/]?$ showarticle.php?article=$1

Ещё одной замечательной возможностью регулярных выражений является возможность проверки данных на соответствие нашему шаблону.

Допустим, нам нужно вывести список новостей за 2004 год. Скрипт вызывается с параметром news.php?year=2004, но ведь можно вызвать и так news.php?year=-23. Можно обработать это в коде программы, а можно и при помощи mod_rewrite:

RewriteEngine On

RewriteRule ^news/([0-9]{4})[/]?$ news.php?year=$1

В этом случае можно будет ввести только адрес вида news/2004/ или news/2004, т.е. параметром может быть только четырёхзначное число.

Если мы введём что-нибудь другое, к примеру news/-23/ сервер выдаст нам ошибку 404 (не найден документ), что вполне соответствует тому, чего мы добивались.

Заключение.

Итак, мы изучили не требующий дополнительного кода метод создания понятных адресов, который можно применить к уже написанному на любом языке скрипту почти его не меняя. В дополнение мы узнали ещё один метод защиты скрипта от нежелательных данных.

Пожалуй, единственным минусом данного подхода является необходимость изучения синтаксиса регулярных выражений, но уверяю Вас, что проведённое за его изучением время не пройдёт даром и очень поможет Вам при обработке текстовых данных.

На этом всё.

Успехов в создании удобных сайтов.

Комментарии RSS

  1. №890
    Дмитрий
    Дмитрий 24 нояб. 2008 г., 12:20:45

    Добрый день. Помогите пожалуйчта с помощью mod_rewrite составить красивый адрес сайта, что то не как не палучается.

    Хачу что бы за места:

    http://site.ru/loads/index.php?act=viewfile&id=327

    Было так:

    http://site.ru/loads/327.xhtml

    Еси можна ответ на мыло, зарание спасибо!

  2. №892
    Sam
    Sam 24 нояб. 2008 г., 13:16:34
    RewriteEngine On
    
    RewriteRule ^loads/index.php?act=viewfile&id;=([0-9]+)$ loads/$1.xhtml
    
    
  3. №1286
    Vad
    Vad 17 февр. 2009 г., 22:20:54

    Я бы предложил:

    RewriteEngine On
     
    RewriteRule ^loads/([0-9]+).xhtml$ loads/index.php?act=viewfile&id;=$1
  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.