Htaccess как сделать чпу

Содержание
  1. Htaccess как сделать чпу
  2. ЧПУ htaccess
  3. Оцените статью:
  4. Статьи
  5. Комментарии
  6. Запись экрана
  7. ЧПУ, роутинг, единая точка входа на PHP
  8. Единая точка входа
  9. Плюсы единой точки входа
  10. Единая точка входа с Apache
  11. Единая точка входа с Nginx
  12. Простой роутинг
  13. Роутинг средствами htaccess
  14. Структура URL адресов в админке
  15. Добавление префикса /admin/ в URL
  16. Продвинутый роутер FastRoute
  17. Пример настройки файла htaccess php
  18. Указываем индексный файл (который первым открывает при обращении к сайту)
  19. Редирект htaccess php
  20. Редирект с сохранением рейтинга страницы
  21. Редирект пользователя с конкретным ip
  22. Склеивание www и http htaccess php
  23. Создание ЧПУ или Человеко-Понятных-Урлов htaccess php
  24. Редирект всех файлов папки на один файл
  25. Защита от хотлинков htaccess php
  26. Определение кодировки htaccess php
  27. Создание своих страниц ошибок
  28. Запрещаем доступ
  29. Настройка ЧПУ ссылок (URL) PHP сайта в удобные для восприятия человеком
  30. Зачем нужна настройка URL ссылок в удобные для восприятия человеком ЧПУ?
  31. ЧПУ адреса на сайте — какие инструменты необходимы?
  32. Основные сведения о настройке ЧПУ ссылок на PHP сайте
  33. Шаблоны и параметры замены для преобразования в ЧПУ ссылки
  34. Как используются регулярные выражения для преобразования URL адресов в ЧПУ
  35. Флаги в правилах замены ссылок на ЧПУ
  36. Перенаправление содержания страницы на новый URL адрес
  37. Условия для правил перенаправлвения с простого URL на ЧПУ
  38. Исключения и дополнения в услвиях правил настройки ЧПУ
  39. Использование серверных переменных в правилах настройки ЧПУ
  40. Настройка ЧПУ ссылок с использованием нескольких правил
  41. Транслитерация названий страниц на PHP и JavaScript в ЧПУ

Htaccess как сделать чпу

ЧПУ htaccess

Всем привет. Сегодня мы с вами рассмотрим процесс создания ЧПУ ссылок через служебный файл htaccess. Итак, поехали!

ЧПУ расшифровывается как человеко-понятные url. То есть эти ссылки визуально имеют более упрощенную структуру. Примеры:

Эти ссылки по сути ведут на одну и ту же страницу, но имеют разную структуру. Согласитесь что ЧПУ ссылка по сравнению с обычной лучше воспринимается. В данном примере это реализовано за счет скрытия расширения файла и передаваемого параметра. Благодаря этому, такая ссылка содержит меньше символов и лучше индексируется поисковыми роботами. Ну да ладно! Теперь перейдем к созданию ЧПУ ссылок.

В примере мы будем преобразовывать ссылку типа https://mysite.com/news.php?id=54 в ЧПУ https://mysite.com/news/54.

Для этого нам понадобится создать служебный файл .htaccess.

Сразу скажу что этот файл не имеет названия и содержит только расширение htaccess.

Для создания нашей ЧПУ ссылки в самом файле htaccess нужно прописать всего две строчки.

Первой строчкой мы активизируем механизм mod_rewrite. Он дает возможность делать перенаправления с одного url адреса на другой. Во второй строчке мы пишем правило которое говорить что если в url встречается строка соответствующая первому шаблону регулярного выражения (^([a-z]+)/([0-9]+)/? ) ,то мы делаем перенаправление на второй шаблон ($1.php?id=$2). Третий параметром передается флаг L который служит для остановки текущей итерации обработки запроса.

Во втором шаблоне у нас указаны $1 и $2 — это по сути подшаблоны первого шаблона которые указаны в скобочках.

$1 — соответствует подшаблону ([a-z]+)

$2 — соответствует подшаблону ([0-9]+)

То есть найденные соответствия подшаблонов первого шаблона подставляются во второй шаблон.

В результате отработки данного кода, если придет запрос по url https://mysite.com/news/54 ,то произойдет перенаправление на адрес https://mysite.com/news.php?id=54. И в итоге нам загрузится страница по адресу https://mysite.com/news.php?id=54, а url в адресной строке останется https://mysite.com/news/54.

Мы также можем спокойно менять передаваемый параметр id.

Здесь мы перейдем на ту же страницу, но уже с параметром ?id=23.

И еще с помощью данного правила мы можем переходить на любую другую существующую страницу которая на находится на том же уровне что и news.php, с передаваемым параметром id.

Здесь мы перешли на страницу test.php c параметром (https://mysite.com/test.php?id=23)

А здесь мы перейдем

на страницу user.php с параметром (https://mysite.com/test.php?id=23).

Вот в принципе и весь принцип построения ЧПУ ссылок. Просто в файле htaccess активируем механизм mod_rewrite и пишем правило по которому с одного url адреса соответствующего первому шаблону будет происходит перенаправление на адрес соответствующий второму шаблону.

На этом данная статья подошла к концу. Если остались вопросы пишите их в комментариях или группе

Я с вами прощаюсь. Желаю успехов и удачи! Пока.

Оцените статью:

Статьи

Комментарии

Внимание. Комментарий теперь перед публикацией проходит модерацию

Все комментарии отправлены на модерацию

Запись экрана

Данное расширение позволяет записывать экран и выводит видео в формате webm

Источник

ЧПУ, роутинг, единая точка входа на PHP

Единая точка входа

Принцип работы единой точки входа очень прост.

Веб-сервер настраивается так, чтобы все HTTP-запросы, вне зависимости от их URL, обрабатывались одним и тем же скриптом index.php .

Текущий URL можно получить из переменной $_SERVER[‘REQUEST_URI’] . Дальше останется только написать свои правила обработки URL-адресов. Упрощённый пример:

Однако в схеме выше есть одно упущение. Ведь если на сервер пришёл запрос к существующему файлу (style.css, script.js, logo.png и т.д) — сервер должен отдать этот файл, а не перенаправлять его.

Вот и весь принцип единой точки входа. Именно так она работает в популярных CMS вроде WordPress и Opencart, в фреймворках Laravel, Symfony и т.д.

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

Лично я предпочитаю также перенаправлять их на index.php.

На самом деле на сайтах часто используются 2 точки входа.

Первая — index.php, вторая — отдельный скрипт, предназначенный для работы с сайтом через консоль.

Плюсы единой точки входа

  • Позволяет использовать ЧПУ
  • Позволяет полностью управлять URL-адресами в PHP, в том числе хранить URL-адреса в базе данных
  • Скрипты с конфигами, важными функциями и библиотеками подключаются только 1 раз и становятся доступны везде. Не нужно дублировать их подключение где-либо ещё.

Единая точка входа с Apache

Для настройки единой точки входа необходимо добавить несколько строк в конфиг веб-сервера. Проще всего это сделать с помощью файла .htaccess .

Этот файл позволяет переопределять настройки Apache для определённых сайтов и папок.

Добавляем следующие настройки в .htaccess:

Чтобы перенаправление срабатывало для существующих директорий, удаляем строку с !-d в конце, вот так:

Готово. Получить URL адрес текущей страницы можно из переменной $_SERVER[‘REQUEST_URI’] .

Также в интернете часто можно встретить другой вариант конфига, отличается он только последней строкой:

Главное отличие в том, что URL-адрес текущей страницы будет храниться как в $_SERVER[‘REQUEST_URI’] , так и в отдельном GET-параметре, в нашем случае $_GET[‘url_param’] , причём этот URL будет очищен от GET-параметров.

Флаг QSA нужен, поскольку без него GET-параметры не будут работать, т.е. массив $_GET будет содержать только url_param и больше ничего.

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

Единая точка входа с Nginx

Открываем конфиг домена и внутри секции server прописываем следующее правило:

Простой роутинг

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

URL текущей страницы находится в переменной $_SERVER[‘REQUEST_URI’]

Теперь мы можем написать очень простой роутер, который смотрит на текущий URL и подключает соответствующий скрипт:

Внесём ещё пару доработок. Во-первых, зачастую URL-адреса должны работать вне зависимости от наличия GET-параметров, поэтому вырежем их из URI:

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

В переменной $segments для URL /products/15 будет лежать массив вида [0 => ‘products’, 1 => ’15’] .

Теперь мы можем легко добавить маршруты для админки:

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

При хранении URL адресов в базе данных роутинг будет выглядеть примерно так (реальный код зависит от библиотеки, которую вы используете для взаимодействия с БД):

Роутинг средствами htaccess

Какое-то время назад было популярно прописывать правила роутинга прямо в htaccess, вот несколько примеров:

У этого подхода есть несколько недостатков:

  • Плохая читаемость правил
  • Нужно хорошо знать регулярки
  • Хранение правил роутинга в настройках веб-сервера — концептуально не очень хорошая идея

Короче, не используйте этот подход.

Структура URL адресов в админке

Обычно URL адреса в админке формируются по одной из следующих схем:

И сразу рассмотрим простой пример:

Итак, мы видим, что модулем здесь является products , а действием, к примеру, add . Что теперь с этим делать?

Если вы знакомы с ООП и MVC, тогда модулем для вас будет название класса, а действием — метод этого класса, который нужно запустить. Если действие не указано, то принято запускать метод под названием index.

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

Перепишем пример, написанный нами в единой точке входа, под новую схему URL:

Итак, мы берём 1-ый фрагмент URL и проверяем, существует ли в папке pages файл с таким названием.

Т.е. при переходе на страницу /test/test2 скрипт проверит существование файла /pages/test.php . Если файл есть — PHP выполнит этот файл, в противном случае выполнится файл /pages/404.php .

Как видите, при таком подходе нам больше не нужно прописывать соответствие URL-адресов и PHP-файлов. PHP сам будет искать нужный файл в папке pages по первому фрагменту URL.

Читайте также:  Как сделать ssh cisco

Теперь осталось только создать файл pages/products.php . Сделаем небольшую заготовку:

Вот так выглядит обработка действий. Мы смотрим на второй фрагмент URL и ищем обработчик этого действия. Для каждого действия (add, update, delete) нужно прописать отдельный блок elseif.

Внутри обработчика add мы смотрим на то, каким методом пришёл запрос, GET или POST. Если GET — отображаем форму, если POST — добавляем товар.

Если вам не нравится вложенная проверка метода, можно сделать иначе. В файле index.php сохраним метод в отдельную переменную:

Затем в products.php меняем заготовку на следующую:

Готово. Да, если вам не нравится, что в коде 2 раза встречается одно и то же действие, только с разными методами, можете использовать немного упрощённую схему URL-адресов из фреймворка Laravel:

Добавление префикса /admin/ в URL

Немного изменим код index.php :

Теперь при запросе страницы /admin/products PHP будет искать файл с названием не products.php , а admin_products.php .

Переименуйте файл и не забудьте заменить в нём все $segments[1] на $segments[2], поскольку в $segments[1] теперь лежит модуль, а в $segments[2] действие.

Продвинутый роутер FastRoute

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

Если вы хотите, чтобы я написал отдельную статью по работе с FastRoute — пишите об этом в комментариях.

Источник

Пример настройки файла htaccess php


Примеры записей в htaccess: Индексный файл, Редирект с сохранением рейтинга страницы, Склеивание www и http, Создание ЧПУ или ЧеловекуПонятныхУрлов, Редирект всех файлов папки на один файл, Защита от хотлинков, Определение кодировки и многое другое!

Указываем индексный файл (который первым открывает при обращении к сайту)

Можно указать один или несколько файлов

Редирект htaccess php

Глобальный редирект(первый /) ВСЁ пересылаем на новый адрес http://www.newsite.ru/

Все обращения к katalog переадресуем на домен newsite.ru в раздел newkatalog

Редирект с сохранением рейтинга страницы

old — пример пути старой страницы. new — пример пути новой страницы.

Редирект пользователя с конкретным ip

Конкретного пользователя (надоел он или нужно его переслать на внутренний раздел) с данным ip пересылает на страницу /out.html

Склеивание www и http htaccess php

Уже многим SEO (продвижение и оптимизация) известно, что для Поисковых Систем адреса с/без www — это разные адреса и доступность сайта с www отрицательно влияет на индексацию и ранжирование. Поэтому зачастую SEO просят разработчиков склеить сайт без www (чтобы при обращении к сайту с www происходила пересылка на без www, т.е. только http)

Теперь даже если Вы наберёте в адресной строке www.yoursite.ru, то сервер перешлёт Вас на http://yoursite.ru

Создание ЧПУ или Человеко-Понятных-Урлов htaccess php

После добавления данной строки в .htaccess будут доступны два адреса для документа. Например: www.yoursite.ru/article.php?id=1 и www.yoursite.ru/article/1

В результате www.yoursite.ru/art.php?type=123 превращается в www.yoursite.ru/cat/type/123/:

Вот ещё частные варианты:

Статья с технически адресом www.yoursite.ru/article.php?id=1 теперь будет доступна со своим понятным человеку названием www.yoursite.ru/katalog-saitov.

Редирект всех файлов папки на один файл

Например вы больше не нуждаетесь в разделе сайта articles и хотите перенаправить все запросы к папке /articles на один файл /non-articles.php. Поможет код ниже

Защита от хотлинков htaccess php

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

Определение кодировки htaccess php

Дополнительные варианты самых популярных кодировок: UTF-8, Windows-1251, KOI8-R. В примерах рассмотрим самую распространённую UTF-8

Создание своих страниц ошибок

Если Вам хочется видеть после неправильной ссылки другую страницу, сделанную, например, самим собой, то указываем в .htaccess следующий код (ну и соответственно делаем там свои страницы):

Видов ошибок на самом деле больше. Можете создать дополнительно и для них записи, опираясь на весь список

Запрещаем доступ

Скорее всего Вы столкнётесь с тем, что часть файлов и директорий надо будет закрыть от общего доступа.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы так получилось нужно указать серверу сделать внутреннее перенаправление всех запросов с адреса «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, какое именно правило ему нужно выполнить.

Читайте также:  Как сделать uefi boot

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

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

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

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

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

В примере выше, запрос к /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 адрес сайта:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итак, мы заменили «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 адрес

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

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

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

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

Читайте также:  Как сделать вирей стекло

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

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

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

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

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

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

  • «!Шаблон» (проверяемая строка несоответствует шаблону)
  • « Шаблон» (проверяемая строка лексически больше шаблона)
  • «=Шаблон» (проверяемая строка равна шаблону)
  • «-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 адрес противоречит новому правилу.

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

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

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

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

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

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

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

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

Рассмотрим функцию на 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 функции транслетерации в ЧПУ:

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

Источник

Поделиться с друзьями
Ответ и точка