Настройка ЧПУ ссылок (URL) PHP сайта в удобные для восприятия человеком

wordpressДоброго времени суток, уважаемые читатели блога SoftMaker.kz. Сегодня мы поговорим, как настроить красивые ЧПУ ссылки (URL) для вашего PHP сайта (где ЧПУ — «человекопонятный урл» или веб-адреса удобные для восприятия человеком, а URL — Universal Resource Locator, адрес страницы, который используется для её определения в сети Интернет).
Не ошибусь, если скажу, что настройка ЧПУ ссылок один из лучших и быстрых способов в улучшении юзабилити и поисковой оптимизации вашего PHP сайта. А оптимизированный сайт сможет приносить бОльший доход от  размещённых в тексте ваших статей блоков контекстной рекламы. Но также стоить отметить, что необходимо не переусердствовать с настройкой ЧПУ и перед её внедрением на десять раз проверить её работоспособность. Ведь настройка адресов сайта в удобные для восприятия человеком является мощным инструментом, но в то же время является непростой задачей.

Зачем нужна настройка URL ссылок в удобные для восприятия человеком ЧПУ?


На этом сайте уже была затронута мысль об  именование страниц в удобные для восприятия человеком. И это неспроста, так как сегодня большинство динамических сайтов имеют в своих URL адресах параметры, с помощью которых показывается, та информация, которая необходима пользователю сайта. Cледующий пример демонстрирует, что значение параметра id в URL адресе указывает скрипту сайта вывести статью номер два:

	http://www.softmaker.kz.php?id=2

К сожалению такие URL адреса не просто запомнить. Попробуйте сказать такой адрес, например по телефону. Поисковые системы, как и пользователи вашего сайта вряд ли получат информацию о содержании страницы вашего сайта из такого веб-адреса. Пользователь не сможет понять, что он найдет статью c примерами программирования в PHP. Более привлекательные URL адреса являются установленными по умолчанию во многих CMS (Content Management System — система управления содержимым). Например, такой адрес:

	http://www.softmaker.kz/id/2

Конечно, такой адрес URL вносит больше ясности и он короче. Поэтому его легче запомнить и намного
легче прочесть, но по нему не скажешь точно, куда он ведёт. Но можно использовать другой вариант:

	http://www.softmaker.kz/PHP/PHP-Examples/

Теперь, используя этот URL пользователь сможет понять, что он сможет прочитать и найти на странице. Поисковик тоже может разбить этот URL адрес на слова, чтобы лучше определить содержание страницы. (дефис «-» в URL адресе воспринимается поисковой системой, как пробел, а знак подчёркивания «_», как символ). Согласитесь, такой URL адрес легче запомнить и передать другому человеку.

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

ЧПУ адреса на сайте — какие инструменты необходимы?

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

Сервер Apache простая система, в которой есть ваозможность настройки ЧПУ ссылок (URL) в удобные для восприятия человеком. Обычно он поставляется со встроенным модулем для настройки ЧПУ адресов, mod_rewrite.

Сервер Майкрософт IIS, не имеет встроенной системы для настройки ЧПУ адресов, но имеет дополнение, которое поддерживает эту возможность. ISAPI_Rewrite очень похожа по функциональность с mod_rewrite.

Код, который мы будем рассматривать, основан на настройке ЧПУ ссылок в mod_rewrite сервера Apache.

Основные сведения о настройке ЧПУ ссылок на PHP сайте

Для начала рассмотрим простой пример. На сайте есть php-файл, который открывает одну страницу. Его URL адрес такой:

	http://www.softmaker.kz/article_CSS_example.php/

Но нам нужно улучшить адрес для восприятия и мы хотим сделать так:

	http://www.softmaker.kz/article-CSS/

Чтобы так получилось нужно указать серверу сделать внутреннее перенаправление всех запросов с адреса «article-CSS» на адрес «article_CSS_example.php». Нужно, чтобы такое перенаправление было внутренним, так как ни к чему, чтобы в адресной строке браузера что-то менялось.

Но для начала, необходимо создать текстовый документ с наименованием «.htaccess», который будет содержать правила настройки ЧПУ ссылок (URL) в удобные для восприятия человеком. Файл должен быть названн именно так «.htaccess» с точкой вначале названия, но не «.htaccess.php» или «php.htaccess». Файл «.htaccess» нужно положить в корневую папку вашего сервера, такую же, где лежит файл из нашего примера article_CSS_example.php. Но если файл «.htaccess» уже лежит в корневой папке, то лучше его начать редактировать, чем перезаписать новым.

Файл .htaccess является конфигурационным файлом для сервера. Если в нём допущена ошибка, тогда сервер вернёт сообщение об ошибке. Обычно это ошибка с кодом 500. Если передавать файл .htaccess на сервер, используя FTP, то нужно помнить, что он передается в режиме ASCII, а не в бинарном режиме (BINARY). В файле .htaccess мы будем выполнять два правила. Первое — включение режима RewriteEngine, второе — указание серверу Apache, какое именно правило ему нужно выполнить.

	RewriteEngine On # Включение режима
	RewriteRule ^article-CSS/?$ article_CSS_example.php [NC,L]
	# Управление запросами для «article-CSS»

Также нужно знать, что всё что находится за символом «#» является комментарием, т.е сервер пропускает мимо всё, что находится за этим символом. Комментариями нужно пользоваться свободно, чтобы потом можно было быстро вспомнить, как это правило работает и для чего его вообще написали. Также в каждом файле «.htaccess» должна быть только одна строчка с включением режима «RewriteEngine».

Поговорим немного об инструкции «RewriteBase». С помощью нее мы преобразуем URL сервера к физическому пути. Если URL вашего сервера не соответствуют физическим путям к файлам, вы должны использовать «RewriteBase» в каждом из «.htaccess» файлов, где вы хотите использовать директивы «RewriteRule».

Предположим, что файл «.htaccess» лежит в /physical/path/.htaccess. Помните: /physical/path это физический путь. Также у вашего сервера настроен алиас:

	Alias /virtual /physical/path

Тогда даем вашему серверу знать, что мы работаем через /virtual, а не через префикс физического пути /physical/path. В файле «.htaccess» пишем:

	RewriteEngine On
	RewriteBase /virtual

После этого правила преобразований будут работать следующим образом:

	RewriteRule ^article\.php$ post.php

В примере выше, запрос к /virtual/article.php корректно преобразуется в физический файл /physical/path/post.php.

А теперь давайте подробнее рассмотрим, как работает инструкция «RewriteRule»:

  • RewriteRule — указывает серверу Apache о начале одного правила.
  • ^/article-CSS/?$ — Это шаблон. Сервер проверяет URL адреса каждого запроса и сравнивает с шаблоном. Если адрес совпадает, то сервер Apache меняет URL адрес запроса на то что находиться в следующем параметре.
  • article_CSS_example.php — Параметр замены. Если шаблон совпадает с запросом, сервер Apache использует этот URL адрес вместо адреса запроса.
  • [NC,L] — Это флаги, которые указывают серверу Apache как применять правило. Сейчас мы используем два флага. Флаг «NC» указывают серверу Apache, что правило не зависит от регистра символов (в адресе запроса могут быть, как прописные, так и строчные буквы). Флаг «L» указывают серверу Apache, что нужно остановить процесс преобразования.
  • # Управление запросами для «article-CSS» — Комментарий объясняет, что делает правило (рекомендуется использовать).

Это правило является простым способом настройки преобразования одного URL адреса в другой. Оно является основой для многих правил преобразования ЧПУ ссылок (URL) в удобные для восприятия человеком.

Шаблоны и параметры замены для преобразования в ЧПУ ссылки

Пример, который мы рассмотрели выше позволяет перенаправлять запросы для одного URL адреса. Но мощь режима mod_rewrite заключается в том, что он позволяет преобразовывать целые группы запросов URL адресов сверяя их с шаблоном, который записан в правиле. Предположим, что нужно изменить все URL адреса сайта. Возьмем пример из первой части статьи. У нас имеется URL адрес сайта:

	http://www.softmaker.kz.php?id=2

И мы хотим преобразовать его к следующему виду:

	http://www.softmaker.kz/id/2

Чтобы не писать правило для каждой статьи id необходимо написать правило, чтобы управлять всеми cтатьями. Поэтому нужно изменить правило к следующему виду:

	http://www.softmaker.kz.php?id={номер}

Нужно изменить этот URL адрес так:

	http://www.softmaker.kz/id/{номер}/

Чтобы сделать это нужно использовать регулярные выражения. Они являются шаблонами (паттернами, от англ. pattern), определёнными в формате, который сервер может понимать. Вот обычный паттерн, который определяет число:

	[0-9]+

Квадратные скобки содержат в себе определенный диапазон сиволов и «0-9» указывает на все числа. Симвлол плюс «+» указывает, что в шаблоне может быть одно или более чисел, стоящих перед знаком «+». Этот шаблон подходит для нашей задачи по поиску числовых категорий в URL адресе PHP сайта. Шаблон этого правила рассматривается как регулярное выражение по умолчанию, поэтому нет надобности где-либо указывать, что он включен или активирован.

	RewriteRule ^id/([0-9]+)/?$ articles.php?id=$1 [NC,L]
	# Управление запросом по категориям

Первое, что можно отметить, так это шаблон взятый в круглые скобки. Он позволяет нам получить обратную ссылку для параметра замены. Выражение «$1» в параметре замены указывает серверу Apache брать из URL адреса всё то, что в скобках шаблона. Можно задать множество обратных ссылок и они будут пронумерованы в порядке появления в шаблоне. Итак, это правило означает, что сервер Apache переправит все запросы для
softmaker.kz/id/{номер}/ на articles.php?id={тот же номер}.

Как используются регулярные выражения для преобразования URL адресов в ЧПУ

Конечно, цель этой статьи не в том, чтобы дать полное руководство в использовании регулярных выражений. Однако, нужно запомнить, что весь шаблон является регулярным выражением, поэтому нужно всегда быть осторожными в использовании специальных символов в регулярных выражениях.

Очень важной гранью является, использование диапазонов в шаблонах. Часто в шаблонах ставят выражения с использованием всех символов, чем указывают определённый символьный диапазон. Но, если всё же сравнивается диапазон, то нужно экранировать символ, который мы хотим обозначить как литерал (буквенный символ) с помощью обратного слэша, так мы укажем серверу Apache рассматривать следующий символ, как литерал.

Следующий пример правила не просто сравнивает URL ссылки «rss.xml», как таковой, а также происхдит сравнение «rss1xml», «rss-xml» и так далее.

	RewriteRule ^rss.xml$ rss.php [NC,L] # Изменение URL ссылки фида

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

	RewriteRule ^rss\.xml$ rss.php [NC,L]
	# Изменение URL ссылки фида

Экранирование применимо только для шаблонов и в параметрах замены не используется. Остальные символы, которые следует экранировать, называются метасимволами:

  • . (любой символ, кроме перевода строки (по умолчанию))
  • * (квантификатор, означающий ноль или более вхождений)
  • + (квантификатор, означающий одно или более вхождений)
  • {} (начало и конец количественного квантификатора)
  • ? (расширяет смысл метасимвола, является также квантификатором, означающим отсутствие либо ровно 1 вхождение, также преобразует жадные квантификаторы в ленивые)
  • ! (в начале строки означает отрицание шаблона)
  • ^ (начало строки или отрицание, если находится в начале диапазона)
  • $ (конец строки)
  • [] (сравнивает любое содержание, начало и конец описания символьного класса)
  • — (диапазон, если используется между квадратными скобками)
  • () (начало и конец группы, группа обратной ссылки)
  • | (альтернативный выбор, или)
  • \ (экранирующий символ)

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

	http://www.softmaker.kz/PHP-Examples/

И мы хотим указать серверу заменить этот URL адрес, но по всем статьям в категории PHP:

	http://www.softmaker.kz.php?id=PHP-Examples

Сделать это можно с помощью следующего правила:

	RewriteRule ^PHP/([A-Za-z0-9-]+)/?$ articles.php?id=$1 [NC,L]
	# Обработка статей

В этом правиле каждый URL адрес будет перенаправлен, если начинается с «PHP», с одного или более (+) разных символов: литералов, чисел и дефисов ([A-Za-z0-9-]) (заметьте, что дефис в конце выбора символов находится внутри квадратных скобок, но он будет определен, как литерал (буквенный символ), но не как разделитель диапазона). И указываем ссылку на категорию в скобках, как «$1» в параметре замены. Теперь сделаем правило общее для всех статей, независимо от категории, то есть, если в адресе будет указана папка отличная от «PHP», скрипт будет работать:

RewriteRule ^[A-Za-z-]+/([A-Za-z0-9-]+)/?$ articles.php?id=$1 [NC,L]
# Обработка всех статей

Итак, мы заменили «PHP» с помощью шаблона, в котором сравниваются символы и дефисы. Но сейчас сравнение происходит не только с папкой «PHP», но и с другими папками, которые соответствуют шаблону сравнения по символам и дефисам.

Флаги в правилах замены ссылок на ЧПУ

Флаги, которые добавляются в конец правил настройки ссылок ЧПУ указывают серверу Apache, как нужно понимать правило и управлять им. Правила могут быть использованы, чтобы указать серверу Apache, например, использовать ли правило независимо от регистра символов (в адресе запроса могут быть, как прописные, так и строчные буквы). Также можно указать Apache остановить текущее сравнение и так далее. Ниже приведён список флагов, которые используются в правилах:

  • C (связывать текущее правило со следующим)
  • CO=cookie (устанавливать cookie)
  • E=var:value (установить переменную окружения «var» по значению «value»)
  • F (запрещает URL — отсылая в загловок код 403)
  • G (страница больше не существует)
  • L (последнее правило, остановить процесс преобразований)
  • N (следующее правило — переход на первое правило)
  • NC (правило независимо от регистра символов, могут быть, как прописные, так и строчные буквы)
  • NE (не экранировать URL адрес при выводе)
  • NS (пропускать правило, если это подзапрос)
  • P (вызывает прокси, пропускает параметр замены через прокси модуль)
  • PT (используется, когда URL проходит через дополнительный обработчик, например, mod_alias)
  • R (временно перемещенная страница — отсылает в заголовок HTTP код 302, по умолчанию)
  • R=301 (навсегда перемещён на новый URL адрес)
  • QSA (добавляет строку параметров запроса к адресу URL параметра замены)
  • S=x (пропускает следующее x количество правил)
  • T=mime-type (принудительно устанавливает тип mime)

Перенаправление содержания страницы на новый URL адрес

RewriteRule ^article/?$ http://www.novyi-domen.kz/article/ [R,NC,L]
# Временно перемещённая страница

С помощью флага «R» мы изменяем работу дерективы RewriteRule. Вместо внутреннего изменения URL, сервер Apache возвращает в HTTP заголовок сообщение о том, что страница перемещена временно на новый URL адрес, указанный в параметре замены, независимо от того какая была указана URL ссылка, обсолютная или относительная. Заголовок отсыдается обратно включая код 302, который указывает на временное перемещение контента страницы.

RewriteRule ^article/?$ http://www.novyi-domen.kz/article/ [R=301,NC,L]
# Навсегда перемещён на новый URL адрес

Если нужно переместить навсегда, то к флагу «R» добавляем строку «=301», тогда сервер Апаче отправит заголовок, указывающий на постоянное перемещение данного контента. В отличие от значения по умолчанию флага «R», «R=301» укажет браузеру показать новую URL ссылку в адресной строке. Перенаправление контента является самым распространённым способом настройки URL адресов.

Условия для правил перенаправлвения с простого URL на ЧПУ

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

	RewriteCond %{HTTP_HOST} ^softmaker\.kz [NC]
	RewriteRule ^(.*)$ http://www.softmaker.kz/$1 [L,R=301]

Это правило перенаправляет все запросы на тот же самый URL адрес вида «www.softmaker.kz». Без этого правила произошло бы зацикливание, потому что каждый запрос постоянно соответствовал бы правилу и отправлялся бы сам на себя. Это правило служит для перенаправления запросов с URL адресами без «www», а условие, стоящее перед правилом выполняет эту задачу.

Условия обрабатываются так же, как и правила. Правило начинаетсч с дерективы «RewriteCond» и указывает модулю mod_rewrite, что строка является правилом. Первым параметром является то, что должно проверятся, вторым параметром является шаблон с которым происходит сравнение. В конце, в квадратных скобках указываются флаги, как и в дерективе «RewriteRule». Первым параметром могут быть разные значения, например проверка домена, какой используется браузер, IP адрес и так далее. В подзаголовке Использование серверных переменных в правилах настройки ЧПУ можно увидеть все варианты, с которыми производится сравнение.

Шаблон в дерективе «RewriteCond» почти всегда используется так же, как и в дерективе «RewriteRule» только в некоторых случаях по-другому. Первый параметр не является шаблоном, если начинается со специального символа, описанного в подзаголовке Исключения и дополнения в услвиях правил настройки ЧПУ. Значит, если нужно использовать регулярные выражения в шаблоне, который начинается с символов «<», «>» или дефиса, то необходимо экранировать их обратным слэшем.

Условия настройки URL адресов в ЧПУ могут, как и правила, содержать в себе флаги, но только два: «NC» и «OR». Флаг «NC», как и в правилах, указывает серверу Apache, что правило не зависит от регистра символов (в адресе запроса могут быть, как прописные, так и строчные буквы). Флаг «OR» используется, когда нужно указать, что несколько условий выполняются для одного правила. По умолчанию, без флага «OR», должны совпасть все условия, тогда правило будет выполнено. С флагом «OR», достаточно выполнения одного из них.

	RewriteCond %{HTTP_HOST}  ^m\.softmaker\.kz  [OR]
	RewriteCond %{HTTP_HOST}  ^en\.softmaker\.kz  [OR]
	RewriteCond %{HTTP_HOST}  ^kz\.softmaker\.kz
	RewriteRule ^(.*)$ http://www.softmaker.kz/$1 [L,R=301]
	# Правило выполниться, если совпадёт хотя бы одно условие

Исключения и дополнения в услвиях правил настройки ЧПУ

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

  • «!Шаблон» (проверяемая строка несоответствует шаблону)
  • «<Шаблон» (проверяемая строка лексически меньше шаблона)
  • «>Шаблон» (проверяемая строка лексически больше шаблона)
  • «=Шаблон» (проверяемая строка равна шаблону)
  • «-d» (является ли проверяемая строка каталогом)
  • «-f» (является ли проверяемая строка файлом)
  • «-s» (является ли проверяемая строка по размеру больше нуля)
  • «-l» (является ли проверяемая строка символической ссылкой)
  • «-F» (является ли проверяемая строка файлом, проверка через подзапрос)
  • «-U» (является ли проверяемая строка URL, проверка через подзапрос)

Использование серверных переменных в правилах настройки ЧПУ

Серверные переменные это набор элементов, которые проверяются в условия настройки ЧПУ. Использование этих переменных позволяет применять правила основанные на разных параметрах запросов, включая определение параметров браузера, параметров URL и определение множества других строковых значений. Синтаксис написания выглядит следующим образом:

	%{ИМЯ_ПЕРЕМЕННОЙ}

В условиях правил настройки «ИМЯ_ПЕРЕМЕННОЙ» заменяется на следующие значения:

  • Заголовки HTTP
    • HTTP_USER_AGENT
    • HTTP_REFERER
    • HTTP_COOKIE
    • HTTP_FORWARDED
    • HTTP_HOST
    • HTTP_PROXY_CONNECTION
    • HTTP_ACCEPT
  • Переменные соединения
    • REMOTE_ADDR
    • REMOTE_HOST
    • REMOTE_USER
    • REMOTE_IDENT
    • REQUEST_METHOD
    • SCRIPT_FILENAME
    • PATH_INFO
    • QUERY_STRING
    • AUTH_TYPE
  • Внутренние переменные сервера
    • DOCUMENT_ROOT
    • SERVER_ADMIN
    • SERVER_NAME
    • SERVER_ADDR
    • SERVER_PORT
    • SERVER_PROTOCOL
    • SERVER_SOFTWARE
  • Переменные даты и времени
    • TIME_YEAR
    • TIME_MON
    • TIME_DAY
    • TIME_HOUR
    • TIME_MIN
    • TIME_SEC
    • TIME_WDAY
    • TIME
  • Специальные переменные
    • API_VERSION
    • THE_REQUEST
    • REQUEST_URI
    • REQUEST_FILENAME
    • IS_SUBREQ

Настройка ЧПУ ссылок с использованием нескольких правил

Чем сложнее структура сайта, тем сложнее нужно настраивать правила для этого сайта. Особенно трудно разрешать противоречия между правилами. Часто возникают противоречия, когда добавляется новое правило в файл .htaccess. В таком случае можно заметить, что новое правило само по себе рабочее и правило, добавленное ранее в файл соответствует URL адресу, но этот URL адрес противоречит новому правилу.

	RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$
	files.php?cat_name=$1&file_title=$2 [NC,L]
	# Обработка закачки блога
	RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$
	articles.php?cat_name=$1&article_title=$2 [NC,L]
	# Обработка статьи блога

В этом примере страница закачки и страница статьи имеют одинаковые шаблоны. Второе правило никогда не совпадёт с URL адресом, так как всё, что должна быть проверено этим правилом будет перехвачено первым. Есть несколько способов обойти это противоречие. В некоторых CMS легко (включая, wordpress) справляются с этой ситуацией, дополнительно добавляя к каждому запросу свою строку:

	RewriteRule ^files/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$
	files.php?cat_name=$1&file_title=$2 [NC,L]
	# Обработка закачки блога
	RewriteRule ^articles/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$
	articles.php?cat_name=$1&file_title=$2 [NC,L]
	# Обработка статьи блога

Конечно, можно написать один скрипт на PHP, чтобы обрабатывать все запросы, проверяя вторую часть запроса на совпадение с продуктом или статьёй. Можно пойти этим путём, хотя слегка увеличится нагрузка на сервер, но обработка URL адресов улучшится.

	RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$
	files_or_articles.php?cat_name=$1&blog_name=$2 [NC,L]
	# Обработка запроса по закачке и по статье блога

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

	# Обработка статьи блога
	RewriteRule ^articles/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)\.html$
	articles.php?cat_name=$1&file_name=$2 [NC,L]
	# Обработка страниц статей в разделе
	RewriteRule ^articles/([0-9]+)/$ articles.php?page=$1 [NC,L]

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

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

	# Обработка страниц статей в разделе
	RewriteRule ^articles/([0-9]+)/$ articles.php?page=$1 [NC,L]
	# Обработка статьи блога
	RewriteRule ^articles/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)\.html$
	articles.php?cat_name=$1&file_name=$2 [NC,L]

Транслитерация названий страниц на PHP и JavaScript в ЧПУ

Следующая функция PHP помогает произвести транслитерацию заголовка страницы в ЧПУ с русского и казахского языков на английский язык:

<?php

function translitURL($str) 
{
    $tr = array(
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        "Д"=>"d","Е"=>"e","Ё"=>"yo","Ж"=>"zh","З"=>"z","И"=>"i",
        "Й"=>"j","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        "У"=>"u","Ф"=>"f","Х"=>"x","Ц"=>"c","Ч"=>"ch",
        "Ш"=>"sh","Щ"=>"shh","Ъ"=>"j","Ы"=>"y","Ь"=>"",
        "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"zh",
        "з"=>"z","и"=>"i","й"=>"j","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"x",
        "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"j",
        "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", 
        " "=> "-", "."=> "", "І"=> "i",
        "і"=> "i", "Ң"=> "n", "ң"=> "n", 
		"Ү"=> "u", "ү"=> "u", "Қ"=> "q", 
		"қ"=> "q", "Ұ"=> "u",
        "ұ"=> "u", "Ғ"=> "g", "ғ"=> "g", 
		"Ө"=> "o", "ө"=> "o", "Ә"=> "a", 
		"ә"=> "a"			 				
    );
    // Убираю тире, дефисы внутри строки
    $urlstr = str_replace('–'," ",$str);
    $urlstr = str_replace('-'," ",$urlstr); 
    $urlstr = str_replace('—'," ",$urlstr);

    // Убираю лишние пробелы внутри строки
    $urlstr=preg_replace('/\s+/',' ',$urlstr);
     if (preg_match('/[^A-Za-z0-9_\-]/', $urlstr)) {
        $urlstr = strtr($urlstr,$tr);
        $urlstr = preg_replace('/[^A-Za-z0-9_\-]/', '', $urlstr);
        $urlstr = strtolower($urlstr);
        return $urlstr;
    } else {
        return strtolower($str);
    }
}

?>

Пример использования PHP функции транслетерации в ЧПУ:

<?php

$tbl_dt = 'data'; $count = 0;
$result = mysql_query("SELECT title,id,name FROM ".$tbl_dt);
$myrow = mysql_fetch_array($result);
do
{
	$name = translitURL($myrow["title"]);
	$result1 = mysql_query (
	"UPDATE ".$tbl_dt." SET name='$name' WHERE id='$myrow[id]'");
	if ($result1 == 'true') {
		echo "<p align='center'>".$myrow["title"]." - ".$name."</p>";
	}else{
		echo "<p align='center'>Транслитерирация "
		.$myrow["title"]." не прошла!</p>";
	}
$count = $count + 1;
}
while ($myrow = mysql_fetch_array($result));

?>

Рассмотрим функцию на JavaScript, которая так же производит транслитерацию заголовка страницы в ЧПУ с русского и казахского языков на английский язык:

String.prototype.trimMiddle=function()
// убирает все пробелы в начале и в конце строки
// помимо этого заменяет несколько подряд
// идущих пробелов внутри строки на один пробел
{
var r=/\s\s+/g;
return this.trim().replace(r,‘ ‘);
}

function SetTranslitRuToLat(){
var text=document.getElementById(‘title’).value;
var transl=new Array();
transl[‘А’]=‘A’; transl[‘а’]=‘a’;
transl[‘Б’]=‘B’; transl[‘б’]=‘b’;
transl[‘В’]=‘V’; transl[‘в’]=‘v’;
transl[‘Г’]=‘G’; transl[‘г’]=‘g’;
transl[‘Д’]=‘D’; transl[‘д’]=‘d’;
transl[‘Е’]=‘E’; transl[‘е’]=‘e’;
transl[‘Ё’]=‘Yo’; transl[‘ё’]=‘yo’;
transl[‘Ж’]=‘Zh’; transl[‘ж’]=‘zh’;
transl[‘З’]=‘Z’; transl[‘з’]=‘z’;
transl[‘И’]=‘I’; transl[‘и’]=‘i’;
transl[‘Й’]=‘J’; transl[‘й’]=‘j’;
transl[‘К’]=‘K’; transl[‘к’]=‘k’;
transl[‘Л’]=‘L’; transl[‘л’]=‘l’;
transl[‘М’]=‘M’; transl[‘м’]=‘m’;
transl[‘Н’]=‘N’; transl[‘н’]=‘n’;
transl[‘О’]=‘O’; transl[‘о’]=‘o’;
transl[‘П’]=‘P’; transl[‘п’]=‘p’;
transl[‘Р’]=‘R’; transl[‘р’]=‘r’;
transl[‘С’]=‘S’; transl[‘с’]=‘s’;
transl[‘Т’]=‘T’; transl[‘т’]=‘t’;
transl[‘У’]=‘U’; transl[‘у’]=‘u’;
transl[‘Ф’]=‘F’; transl[‘ф’]=‘f’;
transl[‘Х’]=‘X’; transl[‘х’]=‘x’;
transl[‘Ц’]=‘C’; transl[‘ц’]=‘c’;
transl[‘Ч’]=‘Ch’; transl[‘ч’]=‘ch’;
transl[‘Ш’]=‘Sh’; transl[‘ш’]=‘sh’;
transl[‘Щ’]=‘Shh’; transl[‘щ’]=‘shh’;
transl[‘Ъ’]=‘J’; transl[‘ъ’]=‘j’;
transl[‘Ы’]=‘Y’; transl[‘ы’]=‘y’;
transl[‘Ь’]=»; transl[‘ь’]=»;
transl[‘Э’]=‘E’; transl[‘э’]=‘e’;
transl[‘Ю’]=‘Yu’; transl[‘ю’]=‘yu’;
transl[‘Я’]=‘Ya’; transl[‘я’]=‘ya’;
transl[‘ ‘]=; transl[.]=»;
transl[String.fromCharCode(1030)]=‘I’; // Казахская сонорная I
transl[String.fromCharCode(1110)]=‘i’; // Казахская сонорная i
transl[String.fromCharCode(1186)]=‘N’;
// Казахская сонорная Н (с хвостиком)

transl[String.fromCharCode(1187)]=‘n’;
// Казахская сонорная н (с хвостиком)

transl[String.fromCharCode(1198)]=‘Y’; // Казахская У мягкая
transl[String.fromCharCode(1199)]=‘y’; // Казахская у мягкая
transl[String.fromCharCode(1178)]=‘K’; // Казахская К (с хвостиком)
transl[String.fromCharCode(1179)]=‘k’; // Казахская к (с хвостиком)
transl[String.fromCharCode(1200)]=‘Y’; // Казахская У твёрдая
transl[String.fromCharCode(1201)]=‘y’; // Казахская У твёрдая
transl[String.fromCharCode(1170)]=‘G’; // Казахская Г (с чёрточкой)
transl[String.fromCharCode(1171)]=‘g’; // Казахская г (с чёрточкой)
transl[String.fromCharCode(1256)]=‘O’; // Казахская O мягкая
transl[String.fromCharCode(1257)]=‘o’; // Казахская o мягкая
transl[String.fromCharCode(1240)]=‘A’; // Казахская A
transl[String.fromCharCode(1241)]=‘a’; // Казахская a

// Убираю тире, дефисы внутри строки
text = text.replace(/\–+/g,»); // символ ‘ndash’
text = text.replace(/+/g,»); // символ ‘-‘
text = text.replace(/+/g,»); // символ ‘mdash’

// Убираю лишние пробелы внутри строки
text = text.trimMiddle();

var result=»;
for(i=0;i<text.length;i++) {
if(transl[text[i]]!=undefined) { result+=transl[text[i]]; }
else { result+=text[i]; }
}

var literals =
‘QqWwEeRrTtYyUuIiOoPpAaSsDdFfGgHhJjKkLlZzXxCcVvBbNnMm
0123456789′;
var newString = »;
for (var i = 0; i < result.length; i++) {
if (!(literals.indexOf(result.charAt(i)) == 1)) {
newString += result.charAt(i);
};
};

document.getElementById(‘name’).value=newString.toLowerCase();
}

Пример использования JavaScript функции транслетерации в ЧПУ:

 <p>
   <label>Введите название <? echo $name_dt ?><br>
	 <input type="text" name="title" id="title" 
	 size="<? echo $SizeOfinput ?>">
	 </label>
 </p>
 <p>
   <label>Введите транслитерацию названия <? echo $name_dt ?><br>
	 <input type="text" name="name" id="name" 
	 size="<? echo $SizeOfinput ?>">
	 </label>
 </p>
 <p>
	 <input name="button" type="button" value="Транслитерировать" 
	 size="<? echo $SizeOfinput ?>" onclick="SetTranslitRuToLat()">
 </p>

Надеюсь, что из этой статьи вы почерпнули необходимую информацию для настройки ЧПУ ссылок вашего PHP сайта и теперь сможете применить эти знания на своём сайте. На самом деле эта тема заслуживает внимания, так как улучшит СЕО продвижение вашего сайта и повысит удобство работы с ним или его юзабилити.