Php как сделать url

ЧПУ, роутинг, единая точка входа на 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.

Теперь осталось только создать файл 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 — пишите об этом в комментариях.

Источник

Функции URL

Содержание

  • base64_decode — Декодирует данные, закодированные MIME base64
  • base64_encode — Кодирует данные в формат MIME base64
  • get_headers — Возвращает все заголовки из ответа сервера на HTTP-запрос
  • get_meta_tags — Извлекает содержимое всех метатегов из файла и возвращает массив
  • http_build_query — Генерирует URL-кодированную строку запроса
  • parse_url — Разбирает URL и возвращает его компоненты
  • rawurldecode — Декодирование URL-кодированной строки
  • rawurlencode — URL-кодирование строки согласно RFC 3986
  • urldecode — Декодирование URL-кодированной строки
  • urlencode — URL-кодирование строки

User Contributed Notes 11 notes

Note also that the URL shown in $HTTP_REFERER is not always the URL of the web page where the user clicked to invoke the PHP script.
This may instead be a document of your own web site, which contains an HTML element whose one attribute references the script. Note also that the current page fragment (#anchor) may be transmitted or not with the URL, depending on the browser.
Examples:

In such case, browsers should transmit the URL of the container document, but some still persist in using the previous document in the browser history, and this could cause a different $HTTP_REFERER value be sent when the user comes back to the document referencing your script. If you wanna be sure that the actual current document or previous document in the history is sent, use client-side JavaScript to send it to your script:

And then check the value of $js in your page script to generate appropriate content when the remote user agent does not support client-side scripts (such as most index/scan robots, some old or special simplified browsers, or browsers with JavaScript disabled by their users).

Источник

Как создать удобный URL в php?

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

где u=12345 идентификатор пользователя.

В последние годы я нашел какой-то веб-сайт с очень красивыми URL-адресами, например:

Как мне это сделать в PHP?

Просто дикая догадка, это как-то связано с .htaccess файлом? Не могли бы вы дать мне больше советов или несколько примеров кода о том, как написать .htaccess файл?

Согласно этой статье , вам нужно .htaccess правило mod_rewrite (помещенное в файл), которое выглядит примерно так:

И это отображает запросы от

Другая возможность — сделать это с помощью forcetype , что заставляет все, что идет по определенному пути, использовать php для оценки содержимого. Итак, в вашем .htaccess файле поместите следующее:

И тогда index.php может предпринять действия в зависимости от $_SERVER[‘PATH_INFO’] переменной:

Недавно я использовал следующее в приложении, которое хорошо работает для моих нужд.

Я пытаюсь объяснить эту проблему шаг за шагом на следующем примере.

0) Вопрос

Я пытаюсь спросить вас вот так:

я хочу открыть страницу как профиль в фейсбуке www.facebook.com/kaila.piyush

он получает идентификатор из URL-адреса и анализирует его в файле profile.php и возвращает данные featch из базы данных и показывает пользователя в его профиле

обычно, когда мы разрабатываем любой веб-сайт, его ссылка выглядит так: www.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678

теперь мы обновляем новый стиль, а не переписываем, мы используем www.website.com/username или example.com/weblog/2000/11/23/5678 в качестве постоянной ссылки

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

1) .htaccess

Создайте файл .htaccess в корневой папке или обновите существующий:

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

2) index.php

Теперь мы хотим знать, какое действие запускать, поэтому нам нужно прочитать URL:

Источник

Функция ЧПУ на php. Создание человеческих ссылок в постах

Доброго времени суток дорогой читатель! Добро пожаловать на мой блог! Сегодня мы продолжим работу над циклом «Создать блог с нуля». Нам предстоит задать фундамент модуля ЧПУ, если быть точнее то нам понадобится php функция, которая по имени страницы определит нам id в таблице базе данных. Но прежде чем мы приступим к написанию функции нам необходимо будет создать и настроить файл htaccess. А так же отредактировать нашу таблицу в базе данных, создать новую колонку, в которой мы будем хранить имена страниц.

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

Цели я указал в анонсе, так что сейчас пару слов для новоприбывших, и приступим =)

Для тех кто на блоге в первые

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

Если Вы собираетесь задержаться на моем блоге, то подпишитесь на RSS ленту блога через ридер, или же по почте

Новая колонка в таблице базы данных

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

Заходим в структуры таблицы blog, и после id создаем новую колонку

Заполняем поля приблизительно вот так ( имя поля nameurl )

Теперь, необходимо заполнить новую колонку. У меня лишь одна запись в базе данных, поэтому для меня заполнение новой колонки не является проблемой =)

В конце имени необходим поставить «.html». Если у Вас в планах не использовать такое окончание у Ваших страниц, то можете не писать, только в этом случае Вам придется немного переделать файл htaccess, а именно убрать расширение там.

Я для тестовой странице использовал вот такое имя: dobro-pozhalovat.html

Ну чтож, с этой задачей мы справились, теперь приступим к самому файл htaccess

Создаем файл htaccess

Создавать лучше всего с помощью программы Notepad++, ибо в некоторых случаях виндоус ругается, что у файла нет имени, ведь имени и в правду нет =) только расширение .htaccess

На всякий случай я скину Вам файл, вот он. Этот файл необходимо поместить в корень нашего блога

Содержимое файла следующее:

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

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

Третья строчка отвечает за ссылки к категориям

Ну и последняя строчка отвечает за ссылку ведущая на форму обратной связи

Обратите внимание что регулярное выражение находится в скобках, если Вы знакомы с регулярками, то прекрасно знаете, что скобки это сохранение . Вопрос, куда переносятся сохраненные данные? Ответ: В переменную 1. Да, именно 1 (единица).

Если Вам нужны ЧПУ без .html то редактируйте регулярное выражение в файле htaccess, на такой вид ссылок, который Вам нужен!

Особо останавливаться тут не будем, я многое тут не знаю, поэтому долго разглагольствовать на эту тему не имею право, единственное что бы я еще добавил, это пару слов о флаге [L]. Я может и ошибаюсь, но как я понял этот флаг останавливает проверки, что идут ниже, это что-то типа break (прерывание работы всего цикла) у циклов.

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

Под итожу то что написано в файле htaccess: Условия, для каждого вида станиц которые есть у нашего движка, а именно

  • для постов
  • для категорий
  • для страницы контактов

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

php функция chpu() — Алгоритм поиска id записи в таблице базы данных

Начнем с создания алгоритма поиска. Для этого нам понадобится знать в какой таблице искать и что искать . У Вас может возникнуть вопрос, что значит в какой таблице? Ведь таблица у нас одна — blog. Это не совсем так, сегодня мы рассматриваем только посты, но так же нам известно, что у категорий тоже есть свои ссылки, а таблица которая будет содержать имена категорий называется menu, именно поэтому алгоритм должен знать в какой таблице ему искать. Пускай функция chpu() на данном этапе будет работать лишь на половину, зато в следующих постах нам не придется редактировать ее (функцию).

Создаем файл chpu.php помещаем его в пользовательские модули нашего движка, и пишем в этом файле следующую функцию:

Функция очень простая, так что не будет на ней останавливаться, тем более я уже не раз разъяснял логику поиска id в таблице.

Скрипт позволяющий определить какая страница открыта

Цель этого скрипта определить в каком режиме запустить функцию chpu(). Определить это можно по GET запросу который создает нам сервер при обращение к станице по ЧПУ. Если Вы внимательно смотрели содержимое файла htaccess, и приблизительно поняли его работу, то Вы должны догадаться, что сервер для себя определяет ссылку вот такого вида

То есть, если пользователь обратился к станице с помощью ЧПУ то сервер создаст GET запрос post, создание такого запроса сигнализирует нам о том что пользователь обратился на страницу поста, стало быть функцию chpu() необходимо запускать в режиме поиска id в таблице blog

Создаем файл getchpu.php, сохраняем его в папке пользовательских модулей и пишем в нем следующий скрипт

Логика скрипта следующая:

  • Скрипт будет работать только в случае если блог работает в режиме вкл ЧПУ, то есть переменная chpu равна единице (это сделано для того чтобы режимы можно было поменять воздействуя лишь на одну переменную)
  • Далее подключается функция поиска id в базе данных
  • Дальше идут два варианта развития, и оба они работают по той же логике, то есть если существует GET запрос post или category то запускается проверка на корректность имени. Эта проверка поможет избежать простейших способов взлома нашего движка. Если проверка прошла успешно (если же нет, то нас перекинет на главную страницу) запускается функция chpu(), тем самым в переменную blog или cat (в зависимости от того какая часть скрипта будет работать =)) попадет id записи в базе данных. Если переменная пустая, то нас перекинет на главную страницу.

Если Вы создаете ссылки без .html, то Вам придется переделать регулярное выражение, ибо Ваши ссылки не пройдут проверки!

Тут есть один момент. Если Вы писали движок с самого начала курса, то у Вас скорее всего нет переменной server_root. Если Вы ставили копию движка, что я давал в посте «Установка нашей CMS», то эта переменная у Вас есть.

Если у Вас нет этой переменной, то откройте пользовательский файл index.php, и сразу после подключение к базе данных пропишите эту переменную

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

Подключаем модуль ЧПУ к нашему движку

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

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

Теперь в самом низу, перед строчкой

Создаем переменную urlsite

Эта переменная необходима для того чтобы определить базовую ссылку сайта. В шаблоне index.html после строчки

вставляем вот такой тег

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

Заключение

Теперь при заходе на страницу http://rsblog.ru/post/dobro-pozhalovat.html я попадаю на страничку статьи

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

Если у Вас есть какие вопросы, то пользуйтесь формой ниже

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

Источник

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