Чпу — Доступ к массивам $_SESSION и $_COOKIES при внедрении ЧПУ.

Содержание

Сессии, Куки и Аутентификация

Введение

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

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

Пункты для размышления

Постарайтесь ответить на предложенные вопросы. После выполнения задания попробуйте ответить на них ещё раз

  • Что такое сессия?
  • Чем «xэш» сессии отличается от «xэша» куков ?
  • Для чего используется «хэш» flash ?
  • Когда нужно использовать flash.now вместо flash ?
  • Что такое фильтры контроллеров и чем они полезны?
  • Как запустить фильтр контроллера только для нескольких специфических действий?
  • В чем разница между аутентификацией и авторизацией?
  • Чем удобен метод #has_secure_password ?
  • Опишите вкратце, как произвести аутентификацию пользователя с помощью этого метода?
  • Какие дополнительные действия (на высоком уровне) нужны, чтобы на самом деле «запомнить» пользователя после того, как он закрыл браузер?
  • Что за гем Devise и чем он полезен?

Куки, Сессии и Флэши

Куки, Сессии и Флэши — это три специальных объекта, которые предоставляет вам Rails 4, и которые ведут себя во многом как хэши. Они используются для хранения данных между запросами. Данные могут сохраняться до следующего запроса, до закрытия браузера или до момента, когда истечет какой-то заранее установленный срок. Кроме времени хранения данных, разница между этими объектами заключается в том, что каждый из них имеет свою определенную область применения, о чем будет рассказно дальше.

Куки — это пары данных по типу «ключ-значение», которые сохраняются в браузере пользователя до истечения какого-то определенного срока. Они применимы практически для любой задачи, но чаще всего их используют, чтобы сохранить пользователя в том же месте веб-страницы, если он потеряет интернет-соединение, или чтобы хранить простые настройки отображения сайта. Вы можете также хранить в них данные корзины пользователя или даже пароли, но это не очень хорошая идея, не стоит хранить в обычных куках браузера информацию, которая должна быть защищенной или сохраняться между сессиями браузера. Пользователь может легко потерять данные, очистив кэш, или украсть/использовать незащищенные данные из куков.

Для работы с куками Rails дает вам доступ к специальному хэшу под названием cookies , в котором каждая пара ключ-значение сохранена в отдельную куку в браузере пользователя. Если бы вы к примеру сохранили cookies[:hair-color] = «blonde» , вы смогли бы открыть инструменты разработчика и увидеть в браузере вашего пользователя куку с ключом hair-color и значением blonde . Удалить их можно, используя cookies.delete(:hair-color) .

С каждым новым запросом к серверу браузер отправляет все куки, и вы можете получить к ним доступ в своих котроллерах и представлениях (views) как к обычному хэшу. Вы также можете увидеть их срок действия, к примеру, используя такой синтаксис cookies[:name] = < value: "cookies YUM", expires: Time.now + 3600>.

Сессии

Задумайтесь о том, каким образом браузеры следят, что пользователь залогинен, когда страница перезагружается. HTTP запросы не имеют состояний, так как же вы определите, что запрос пришел именно от залогинненого пользователя? Вот почему важны куки — они позволяют вам отслеживать пользователя от запроса к запросу, пока не истечет их срок действия.

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

Чтобы идентифицировать сессию юзера, Rails хранит в браузере пользователя специальную безопасную и защищенную от изменений куку, которая содержит весь хэш сессии (поищите ее в инструментах разработчика в браузере, в разделе «Ресурсы»), и она перестает действовать, когда браузер закрывается. Когда бы пользователь ни сделал запрос к вашему приложению, этот запрос автоматически включает куку сессии (как и остальные куки), и вы можете использовать ее, чтобы отслеживать, залогинен ли пользователь. Это все может сейчас казаться абстрактным, но очень скоро вы увидите как это работает на практике.

Rails дает вам доступ к хэшу ‘сессии’ практически так же, как и к хэшу ‘куков’. Используйте переменную session в своих представлениях или контроллерах, вот так:

Зачем нужны и куки и сессии? Они похожи, но это не одно и то же. session это весь хэш, который хранится в безопасной куке сессии, который действует до момента закрытия браузера. Если вы посмотрите в инструментах разработчика, то срок действия («expiration») этой куки обозначен как «сессия». Каждое значение хэша cookies сохраненяется в отдельной куке.

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

Несколько дополнительных замечаний к теме куки и сессии

  • session и cookies это не настоящие хэши, Rails просто притворяется, что это так, чтобы вам было легче работать с ними. Однако вы можете считать их хэшами, потому что они ведут себя очень похоже на настоящие хэши.
  • Размер данных, которые вы можете хранить в хэше сессии или куках браузера ограничен (

4kb). Этого достаточно для любых «обычных» целей, однако не нужно пытаться заменить этим хранилищем базу данных.

Флэши

Вы уже видели и использовали flash хэш, но мы рассмотрим его еще раз, теперь с позиций понимания сессий. flash — это специальный хэш (ну, на самом деле метод, ведущий себя как хэш), который хранит данные только от одного запроса до следующего. Можно представить его как session хэш, который самоуничтожается после открытия. Он обычно используется, чтобы посылать сообщения от контролера к представлению, чтобы пользователь мог видеть сообщения об успешной отправке формы (или о том, что форму не получилось отправить).

Если вы хотите показать сообщение «Спасибо за подписку!» в браузере пользователя, после того, как запустили экшен #create (которое обычно использует redirect_to для отправки пользователя на совершенно новую страницу в случае успеха), как вы отправите это сообщение об успешной подписке? Вы не можете использовать локальную переменную (instance variable), потому что редирект вынуждает браузер выдать совершенно новый HTTP запрос, и все переменные теряются.

Здесь вам на помощь приходит флэш! Используйте для сохранения flash[:success] (можете назвать как угодно) и эти данные будут доступны вашему представлению до следующего запроса. Как только представление откроет хэш, Rails сотрет данные, то есть они не будут показаны при переходе пользователя на новую страницу. Это очень ловко и удобно.

А что если пользователь не смог подписаться, потому что введенные данные не прошли валидацию? В этом случае обычный экшен #create просто отрендерит #new , используя существующие локальные переменные. Это не является новым запросом, и вы, вероятно, захотите сразу же показать пользователю сообщение об ошибке валидации. На этот случай у вас есть удобный хэш flash.now , другими словами flash.now[:error] = «Введите правильные данные!» . Как и обычный флэш, это сообщение самоуничтожится после открытия.

Однако вам нужно прописать отображение флэш сообщений в представлениях. Обычно пишется короткий хэлпер, который выведет в верхней части окна браузера любое доступное флэш сообщение(-ия). Также вы можете добавить сообщению класс, который позволит добавить сообщению любые CSS-стили, например выделить :success сообщения зеленым цветом, а :error — красным.

Фильтры контроллеров

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

Мы делаем это, используя фильтр «before», который принимает в качестве аргумента имя метода, который мы хотим запустить:

Метод before_action принимает символ метода, который будет запущен прежде любого другого кода в контроллере. Если он вернет false или nil , запрос не будет выполнен.

Вы можете назначать фильтр конкретным экшенам с помощью оции only , вот так: before_action :require_login, only: [:edit, :update] . Или наоборот, если вы используете опцию :except , фильтр сработает для всех экшенов кроме указанного.

Лучше прятать фильтрующие методы в ‘private’, так чтобы они были доступны только из своего контроллера.

Ну и последнее, фильтры могут наследоваться, так что если вы хотите применить фильтр к экшенам абсолютно всех контроллеров, поместите его в файл app/controllers/application_controller.rb .

Аутентификация

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

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

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

Аутентификация Basic и Digest

Если вам нужен простой и небезопасный способ аутентификации, то можно использовать аутентификацию HTTP Basic. Мы не будем здесь рассматривать ее подробно, но в общем она подразумевает ввод имени пользователя и пароля в простую форму и отправку их (в незашифрованном виде) через сеть. Для этого используется метод #http_basic_authenticate_with (примеры смотрите в разделе дополнительные ресурсы), и этот же метод ограничивает доступ к определенным контроллерам для неаутентифицированных пользователей.

Для чуть более безопасной (через HTTP) системы аутентификации, используйте аутентификацию HTTP Digest. Опять же, мы не будем ее здесь подробно расписывать. Она основана на запуске метода через #before_action и дальнейшем вызове #authenticate_or_request_with_http_digest , который принимает блок, который должен вернуть «верный» пароль, который должен быть предоставлен.

Проблема с этими способами заключается в том, что имена и пароли в явном виде находятся в контроллере (или где-то еще), так что это можно использовать только как временное решение.

Создаем свою аутентификацию

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

Во-первых, мы не храним пароли в базе данных в виде текста. Делая так, мы просто напрашиваемся на неприятности (спорим, вы тоже читали новости о взломанных сайтах и утекших паролях?). Вместо этого, мы храним зашифрованную версию пароля («password digest»).

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

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

Rails не заставляет вас делать все самостоятельно. Вам предоставляется метод под названием #has_secure_password , который вы просто встраиваете в модель User и он добавляет множество возможностей, которые вам нужны. Чтобы работать с этим удобным методом, вы настраивате в модели User обработку атрибутов password и password_confirmation , однако не сохраняете эти значения в базе данных. Метод has_secure_password взаимодействует с их значениями, превращая их в хэши.

Чтобы инициализировать новую сессию пользователя (когда он логинится), вам нужно создать новый контроллер (обычно это sessions_controller.rb ) и соответствующие роуты для :new , :create и :destroy . Если пользователь передает корректные логин и пароль (а мы проверяем это, используя метод #authenticate ), вы сохраняете ID пользователя в переменную session , которую можно использовать для подтверждения того, что пользователь на самом деле тот, кем представился. Это простой способ аутентификации пользователя, который использует существующую инфраструктуру сессий Rails, но данные в нем хранятся только пока существует сессия.

Если ваш пользователь хочет, что его «запомнили» (вы, наверное, тысячу раз видели чекбокс «запомнить меня» в форме входа на сайт), вам нужен способ запомнить его на более долгое время, чем длится сессия браузера. Чтобы это сделать, вам нужно будет создать еще один столбец в таблице Users, где будет храниться зашифрованный remember_token (вообще вы можете назвать его как угодно). Вы будете использовать его, чтобы сохранить рандомную строку для этого пользователя, которая будет в дальнейшем использована для его идентификации.

Вы будете отдавать незашифрованный токен в браузер пользователя в качестве постоянной куки (используя cookies.permanent[:remember_token] ). Эта кука будет отправляться с каждым новым запросом, так что вы сможете сверить ее с зашифрованным образцом в базе данных, чтобы проверить, кем является пользователь, когда он сделает запрос. Это более явная и длительная версия того, что Rails делает с сессиями. Принято делать сброс токена каждый раз, когда пользователь выходит с сайта и логинится заново.

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

Общее пошаговое описание:

  1. Добавьте в таблицу Users столбец, который будет содержать password_digest пользователя.
  2. Когда пользователь зарегистрируется, хэшируйте его пароль и сохраните ХЭШИРОВАННУЮ версию в новом столбце базы данных, с помощью метода has_secure_password , добавленного в модель User.
  3. Не забывайте о необходимой валидации длины пароля и подтверждения пароля.
  4. Создайте контроллер для сесссий (и соответствующих роутов) и используйте метод #authenticate , чтобы пользователь мог залогиниться после того как ввел верные данные в форму входа.
  5. Запоминайте пользователей, создав столбец remember_token в таблице Users и сохраняя этот токен как постоянную куку в браузере пользователя. Обнуляйте ее при каждом новом входе на сайт.
  6. При каждой загрузке страницы, которая требует аутентификации (и использования #before_action в соответствующем контроллере) первым делом проверьте сравните куку remember_token с базой данных, чтобы понять, залогинен ли уже пользователь. Если нет, перенаправьте его на страницу входа.
  7. По необходимости создайте методы-хелперы, которые позволят вам делать вещи вроде простого определения, залогинен ли пользователь, или сравнить текущего пользователя с другим.
  8. Профит.

Devise

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

Несмотря на это, в итоге вы будете использовать его в большинстве своих проектов, после того как освоите самостоятельно создание аутентификации. Использовать Devise несравнимо лучше, чем строить аутентификацию своими руками, потому что он решает множество проблем и закрывает потенциальные лазейки в безопасности, о которых вы даже бы и не подумали. Devise позволяет вам взаимодействовать с более продвинутыми системами аутентификации при работе с API, такими как OAuth. Поэтому, чуть позже он будет очень для вас полезен.

Вкратце, Devise предоставляет вам набор форм для регистрации и входа на сайт, а также методы для их внедрения. Он состоит из 10 модулей (и вы можете выбрать, какие именно будете использовать). Вы устанавливаете гем ‘devise’ и запускаете установщик, чтобы перенести файлы в свое приложение. Вам также нужно будет запустить миграцию базы данных, чтобы добавить дополнительные поля в свою таблицу Users.

Конфигурация будет зависеть от ваших предпочтений. Хотите ли вы, чтобы пользователи подтверждали регистрацию по e-mail (модуль Confirmable )? Хотите ли позволить пользователю сбросить пароль (модуль Recoverable )?

Изучение гема Devise выходит за рамки этого урока, но вы совершенно точно будете использовать его к концу курса. Просто читайте документацию. Документация Devise впечатляет, она доступна на Github. Мы приводим ссылку, чтобы вы взглянули на нее, почитали, и сохранили где-то в подкорке до той поры, когда начнете использовать этот гем.

Ваши задания

  1. Прочтите Rails Guides on Controllers главы 5-6. Сейчас не слишком заморачивайтесь с деталями конфигураций session_store в п.5.1.
  2. Прочтите Rails Guides on Controllers главу 8, чтобы понять фильтры контроллеров.
  3. Прочтите Rails guides on Controllers главу 11, чтобы больше понять об аутентификации.
  4. Бегло просмотрите Devise Documentation. Прочтите о том, как установить этот гем в ваше Rails-приложение, и за что отвечают разные модули. Вам не нужно использовать Devise прямо сейчас, так что это просто разведка на будущее.

Заключение

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

Этот урок должен был дать вам представление о том, насколько сложными могут быть системы аутентификации, однако он должен был также убрать налет таинственности с механизмов работы сайтов, на которых вы бывали сотни раз. Аутентификация — не ракетостроение, все гораздо проще, и уже скоро вы сами будете встраивать ее в свое приложение.

Дополнительные ресурсы

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

Сессии в PHP

Сессии в PHP представляют из себя механизм сохранения на стороне сервера информации о компьютере клиента. На самом деле сессии в PHP — это не такая сложная тема, но для её понимания нужно знать принцип работы cookie в PHP. Так что, если вы не знаете как работают cookie в PHP, то сначала читайте соответствующую статью, а потом уже возвращайтесь сюда.

Слово session с английского переводится как сеанс, так сам смысл сессий в PHP становится более понятным, но у программистов прижился термин «сессии», его и мы будем использовать в этой статье.

Сессии в PHP очень похожи на механизм cookie, те же самые пары ключ => значение, только они хранятся на стороне сервера.

Функция session_start()

Сеанс нам нужно начать, для этого существует функция session_start() . Эта функция стартует сеанс, или сессию, как угодно можно назвать это.

Функция session_start() желательно вызывать в самом начале страницы, но в моих примерах я этого не делаю.

Массив $_SESSION

Сессии — это группы переменных, которые хранятся на сервере, но относятся к одному уникальному посетителю. Повторю, это ключевой момент: сессии хранятся на сервере.

Для того, чтобы обеспечить взаимодействие каждого посетителя с его данными из его сессии используется файл cookie, команду создать который PHP даёт сам, вам об это беспокоится не нужно. Этот cookie имеет значение только для сервера и не может быть использован для получения данных о пользователе.

На сервере данные сессии хранятся в текстовом файле и они доступны в программе PHP в массиве $_SESSION . Чтобы сохранить переменную в сессии нужно присвоить ей значение в этом массиве.

Давайте наконец начнём использовать примеры. Всё очень просто.

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

Обратите внимание, если во втором примере мы удалим функцию session_start() то у нас не будет доступа к данным массива $_SESSION .

Функция session_id()

После того, как сессия создана, вы автоматически получаете доступ к уникальномы идентификатору сессии при помощи функции session_id() . Эта функция позволяет как задавать, так и получать значение идентификатора сессии.

Можете посмотреть в панели инструментов для разработчиков вашего браузера (в Chrome для этого нажмите Ctrl + Shift + I, потом Resources, и там найдёте cookie), этот домен положил вашему браузеру cookie с именем PHPSESSID и примерно таким значением: «7g5df9rkd1hhvr33lq1k6c72p7».

Именно по значению PHPSESSID сервер будет определять ваш браузер и работать с соответствующим набором переменных, которые будут доступны скрипту через массив $_SESSION, как уже писалось ранее.

Функция session_name()

Если функции session_id() позволяет получать значение идентификатора сессии, функция session_name() позволяет узнать имя сессии.

Ещё раз про функцию session_start()

Теперь мы знаем больше про мешанизм работы сессий в PHP и нужно ещё раз вернуться к функции session_start() . Эта функция инициализирует механизм сессий для текущего пользователя. Как именно это происходит:

  • Если пользователь запустил сайт впервые, то session_start() устанавливает cookie у клиента и создаёт временное хранилище на сервере, связанное с идентификатором пользователя.
  • Определяет хранилище, связанное с переданным текущим идентификатором.
  • Если в хранилище на сервере есть данные, они помещаются в массив $_SESSION.
  • Если register_globals из файла php.ini равен On, то все элементы массива $_SESSION превращаются в глобальные переменные.

Пример использования сессии

Сейчас мы рассмотрим пример, который позволит провести небольшие эксперименты с сессиями.

Вся работа сессий основана на массиве $_SESSION , это хорошо видно в данном примере.

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

Завершение сессии

Так как сессии часто используются для авторизации пользователей, то нужно иметь механизм «выхода» из системы.

Для того, чтобы завершить сессию нам нужно:

  1. Очистить массив $_SESSION.
  2. Удалить временное хранилище на сервере.
  3. Удалить сессионный cookie.

Очистить массив $_SESSION можно при помощи функции session_unset() .

Функция session_destroy() удаляет временное хранилище на сервере. Кстати, она больше ничего не делает.

Удалить сессионный cookie нужно при помощи функции setcookie() , которую мы изучили в уроке pабота с cookie в PHP.

Пример завершения сессии:

Теперь можете провести эксперимент: запустить в одном окне пример со счётчиком, накрутить счётчик, а потом запусть пример с удалением сессии и снова обновить страницу со счётчиком.

Удаление файла cookies можно сделать так:

setcookie(session_name(), », time() — 60*60*24*32, ‘/’)

Ещё раз про функции session_name() и session_id()

Функции session_name() и session_id() на практике используются редко, но я о них пишу, так как в статье нужно раскрыть сам механизм работы сессий в PHP.

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

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

Тут подробней остановимся, если вы запустите пример из секции про функцию session_name() (вот ссылка) в разных браузерах (например в Chrome и в Internet Explorer), то в каждом браузере будет свой, уникальный идентификатор сессии. Браузеры хранят файлы cookies каждый в своей папке, поэтому функция session_start() даст каждому браузеру создать свой, уникальный идентификатор и, соответственно, для каждого браузера будет создано уникальное хранилище на сервере. Поэтому пример со счётчиком (этот) в каждом браузере будет работать независимо друг от друга.

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

Если вы запустите этот пример, то не факт что вы увидите там единицу. Другие посетители могли уже изменить значения в хранилище сессий на сервере. Когда в этом случае сервер удаляет хранилище — я не знаю, поэтому при превышении счётчиком значения 100 буду завершать сессию.

Установка времени ожидания

По умолчанию, сессия «живёт» до тех пор, пока посетитель не закроет окно браузера. Это обусловлено тем, что функция session_start() ложит клиенту такой cookie.

Время жизни сессии можно изменить используя функцию session_set_cookie_params() , вот её синтаксис.

session_set_cookie_params (int lifetime [, string path [, string domain [, bool secure]]])

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

Действие функции session_set_cookie_params() распространяется только на период работы скрипта.

Вот пример использования этой функции:

Накрутите счётчик и закройте браузер, через 30 сукунд опять откройте этот пример. Ваша сессия сохранится.

Проблема с Cookies при переходе на ЧПУ

Устанавливаю cookies через плагин на событие «OnWebPagePrerender», кукис работают через раз после первой установки, на одних страницах обновляются, на других нет. Без ЧПУ вроде нормально работает.

Ниже код плагина

Пробовал и с указанием «/» и домена…

Причем именно перезапись кукис не работает на некоторых страницах, а первичная установка работает нормально.

Также сейчас сам плагин перестал работать на событие OnWebPagePrerender, поставил OnHandleRequest, может быть есть более оптимальный вариант?

Системы ЧПУ с web-доступом

Читайте также:

  1. Абсолютная чувствительность сенсорной системы
  2. Адаптация сенсорной системы
  3. Акт осмотра и испытания системы теплового снабжения
  4. Акт приемки в наладочную эксплуатацию теплового ввода, теплоцентра, системы отопления и горячего водоснабжения
  5. Акт приемки в эксплуатацию системы АППЗ
  6. Акт приемки системы дымоудаления
  7. Акт приемки системы кабельного телевидения
  8. Акт теплового испытания системы центрального отопления на эффект действия
  9. Анализ использования системы автоматизированного управления
  10. Архитектура открытой системы ЧПУ
  11. Базы данных— это совокупность логически взаимо­связанных массивов. Для управления базами данных, их создания, ведения используются системы управления ба­зами данных.
  12. Библиотечные системы и сети РБ.

Язык XML, OMAC-схемы (Open Modular Architecture for Controllers) и протокол SOAP (Simple Object Access Protocol) используют для унифицированного доступа к следующему поколению станков с ЧПУ, имеющих web-доступ. При этом реализуется концепция взаимодействия оборудования в рамках жизненного цикла производства изделий от их проектирования через весь ТП.

Несколько лет назад фирма Boeing проявила инициативу «design anywhere, build anywhere» (проектирование и производство в любом месте). Соответственно этому принципу, с использованием OMAC API, XML и SOAP, разработана архитектура системы ЧПУ типа GNC (Generative Numerical Control, интеллектуальная система ЧПУ, другое название – «feature-based») для ОС Windows. Прагматичная альтернатива состоит в том, что технологии OMAC API и XML встроены в традиционную закрытую систему ЧПУ для интеграции в производственное информационное пространство.

Сегодня в космической индустрии, тяжелой и автомобильной промышленности разрабатывается концепция, согласно которой станок с ЧПУ становится узлом корпоративной web-сети (рис. 11.9). Становится ясным, что наибольшую эффективность OMAC API имеет в web-домене коллективно используемых станков с ЧПУ. Функции OMAC API конвертируются в язык Internet путем использования XML-схем для конкретного HMI.

Центральным элементом в этой архитектуре служит программный компонент – Windows-расширение XMC (extension for Motion Control) для каждого конкретного станка с ЧПУ. Следовательно, XMC размещается между OMAC API и станком с ЧПУ. XMC-XML-система использует OMAC XML-схемы и SOAP-про­токол, чтобы создать гомогенную информационную структуру над системами ЧПУ от разных производителей. Единственным ограничением служит обязательное использование ОС Windows в интерфейсе оператора.

Рис. 11.9. Система ЧПУ с web-доступом

Многочисленные пользователи устанавливают дополнительное оборудование, чтобы сделать традиционные системы ЧПУ открытыми. Большое число станков с ЧПУ имеют возраст более 30 лет. Однако, как правило, в радикальных изменениях нет нужды, а существенные улучшения могут быть достигнуты путем дооснащения станков с ЧПУ внешним одноплатным компьютером MTIB (Machine Tool Interface Board).

Цель состоит в превращении системы ЧПУ в узел корпоративной сети, использующий OMAC XML-схемы как стандартный универсальный язык ЧПУ. Система ЧПУ становится web-сервером, который получает, разделяет и распространяет информацию по всему предприятию. XML используется для распространения информации в пределах и за пределами предприятия.

Дата добавления: 2015-05-29 ; Просмотров: 558 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Наиболее распространенные проблемы обработки на станках с ЧПУ, решаемые с помощью CAD/CAM/CAPP-системы ADEM

Сегодня на многих машиностроительных предприятиях России активно проводится техническое перевооружение производства. Обновляется устаревший станочный парк для механообработки, а также для других видов обработки металлов (литье, термообработка, обработка металлов давлением и др.). К сожалению, не все предприятия, точнее их руководящий состав, понимают, что аппаратная автоматизация производства (станки с ЧПУ) должна быть неразрывно связана с программной автоматизацией (соответствующие CAD/CAM/CAE/PDM/MES­системы). Невозможно добиться качественного результата по повышению производительности только путем приобретения нового металлообрабатывающего станка, который очень часто программируется вручную оператором на стойке с ЧПУ, что делает финансовые затраты по его закупке бессмысленными. Ведь управляющую программу все равно надо проверять непосредственно на станке, все команды и функции приходится прописывать вручную на стойке. Конечно же, большое количество предприятий добилось очень высокого уровня автоматизации процессов производства, внедрив у себя и MDC­системы для сбора аналитики и мониторинга использования оборудования с ЧПУ, и MES­системы для грамотного планирования производства, и PDM­системы для организации работы с конструкторско­технологическим составом изделия. Но ведь и сегодня на профильных выставках по металлообработке можно услышать вопросы типа «а что такое CAM­система» или «мы закупили новые станки фирмы N, но их программирование осуществляем на контроллере ЧПУ». При грамотной финансовой политике стоимость систем автоматизации почти полностью растворяется на фоне стоимости металлообрабатывающего станка, тем более что такое внедрение не требует огромных одноразовых финансовых вложений, поскольку может выполняться поэтапно.

Компенсация недостатков математического аппарата станков

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

Тем не менее в этой статье мы предлагаем читателям коснуться именно проблем внедрения систем автоматизации подготовки управляющих программ (УП) для станков с ЧПУ (то есть CAM­систем), а следовательно, проблем адаптации САМ­системы к производственным процессам на станках с ЧПУ. Ведь именно САМ­система по своему назначению наиболее приближена к конечному результату деятельности машиностроительного предприятия — изготовлению продукции в необходимые сроки в нужном количестве согласно размерным характеристикам и техническим требованиям, указанным на чертеже. САМ­система является буферным звеном между виртуальной и реальной моделью детали или сборочного узла, поэтому относиться к ней следует не как к «коробочной» поставке, а как к полноценному решению, включающему множество факторов — проблем предприятий, которые приходится решать специалистам по внедрению систем и которые на том или ином предприятии могут быть абсолютно разными, что нередко влияет на совокупное ценообразование решения в каждом конкретном случае.

Первая из таких проблем ранее описывалась в наших статьях, а именно — отсутствие синхронизации работы приводов станка по линейным и круговым перемещениям: разбиение перемещений с большим угловым перемещением по одной из осей вращения. Это случаи, когда обработка уже спроектирована, получена управляющая программа, а станок не может корректно отработать все запрограммированные перемещения инструмента. Подобные трудности имеют место при несовершенстве математического аппарата станков. Например, отсутствует синхронизация перемещений по угловым и линейным осям. Грубо говоря, по прямой инструмент перемещается быстро, а поворачивается (наклоняется) медленно. В таких случаях, если встречается участок траектории инструмента с небольшим линейным перемещением и довольно большим изменением угла наклона инструмента, происходит следующее: инструмент совершает перемещение по прямой, практически не изменяя угла наклона, а после того, как инструмент уже пришел в конечную точку перемещения, происходит большая часть перемещения по угловым осям. Как следствие — зарезы на поверхности детали, получаемые от неравномерности перемещений инструмента. Выход из этой ситуации один — компенсировать недостатки в математических расчетах, выполняемых станком, средствами САМ­системы. ADEM в таких случаях позволяет разбивать большие перемещения по угловым и линейным осям на несколько небольших участков, тем самым давая возможность станку выполнить перемещение и по линейным, и по угловым осям с примерно одинаковой скоростью, что, в конечном счете, помогает избежать дефектов в виде зарезов на формируемой поверхности.

Деталь с массивом отверстий, которая обрабатывается
с помощью подпрограмм из табл. 1

Таблица 1

Фрагмент УП с использованием подпрограмм

Приведем еще несколько примеров, относящихся к программированию обработки на станках с ЧПУ старого образца, которые не поддерживают круговую интерполяцию в 360°. За счет постпроцессора в программной среде ADEM эта проблема решается автоматически путем разбиения дуги в 360°на дуги по 90°. Нередко также встречаются станки, которые не поддерживают функцию постоянной скорости резания G96. За счет постпроцессора специалисты Группы компаний ADEM осуществляют организацию автоматической поддержки данной функции путем переключения оборотов в необходимых (рассчитываемых постпроцессором) точках. В сегменте станков, программируемых с виртуальных стоек (например, nccad), бывают ситуации, когда стойка не поддерживает радиусную коррекцию фрезы (G41, G42). В таких случаях единственным способом поймать точный размер оказывается использование CAM­системы. Например, с помощью фрезы D8 произвели фрезеровку и оказалось, что припуск снят не полностью. Это бывает, если в качестве инструмента используется фреза с большим вылетом и ее отгибает в процессе обработки или если фреза «подсевшая». В таком случае в CAM­системе ADEM диаметр инструмента меняется, к примеру, на D7,9.

Образец поверхности обработки с использованием команды управления центром инструмента и без таковой

Также одной из распространенных проблем станков с ЧПУ старого образца является недостаточный объем внутренней памяти для хранения УП. Из­за отсутствия USB­разъема хранение на сменных электронных носителях также невозможно. Решением является переход на автоматическое создание параметрических программ, что и было осуществлено на предприятии «ЗиО­Подольск». Была поставлена задача задать цикл глубокого сверления для массива около 20 тыс. отверстий. Для этого необходимо использовать стандартные циклы сверления систем ЧПУ Fanuc, а не стандартные циклы типа G83. Общая УП была разбита на подпрограммы в несколько типов: 1 — дробление длины отверстия, 2 — сверление одного отверстия, 3 — сверление n отверстий при определенном шаге и уклоне строк сетки. К примеру, подпрограмма L41 задает повторение программы P23 определенное число раз. Следующим шагом необходимо было дать описание методики составления УП технологам, работающим на предприятии, чтобы они четко знали алгоритм своих действий, и их задачи в этой области сводились к минимуму. В итоге, исходными параметрами для обработки были: шаг отверстий по оси X, шаг отверстий по оси Y и угол наклона сетки отверстий. Выбор отверстий осуществляется рамкой, а задачей системы ADEM, в свою очередь, становится составление УП, которая программирует обработку отверстий в определенном порядке с помощью подпрограмм. В табл. 1 приведен образец УП с использованием подпрограмм для обработки детали.

Проблемы с более современным оборудованием с ЧПУ сводятся к тому, что некоторые предприятия зачастую закупают многокоординатные станки с урезанным функционалом по управлению центром инструмента в системе ЧПУ (функция RTCP (Rotation Tool Center Point) в системе ЧПУ Fanuc, Япония), что предельно важно при программировании на таких станках.

Таблица 2

Фрагмент УП с командой управления
центром инструмента G43.3

Фрагмент УП без команды управления
центром инструмента G43.3

Z49.374 A46.602 B64.231

G1 X­60 Y60 Z48 F20

X­58.332 Z46.453 A44.849 B65.255

X­56.62 Z44.946 A43.068 B66.435

X­55.747 Z44.209 A42.168 B67.088

X­54.865 Z43.482 A41.263 B67.784

X­53.972 Z42.767 A40.355 B68.527

X­53.07 Z42.063 A39.443 B69.317

X­52.158 Z41.371 A38.529 B70.157

X­51.237 Z40.69 A37.614 B71.049

X­50.307 Z40.022 A36.699 B71.996

X­49.369 Z39.366 A35.786 B73.001

X­48.422 Z38.723 A34.875 B74.066

X­47.468 Z38.092 A33.969 B75.194

X­46.505 Z37.474 A33.068 B76.389

X­45.535 Z36.869 A32.175 B77.653

X­44.558 Z36.277 A31.291 B78.991

X­43.574 Z35.699 A30.418 B80.406

X­42.277 Z34.963 A29.295 B82.381

X­41.278 Z34.416 A28.457 B83.989

X­40.272 Z33.882 A27.638 B85.691

X­39.258 Z33.361 A26.84 B87.491

X­38.236 Z32.853 A26.066 B89.393

X­37.207 Z32.358 A25.319 B91.399

X30.074 Y88.125 Z­22.139 A44.849 B65.255

X32.36 Y86.13 Z­18.984 A43.068 B66.435

X33.563 Y85.05 Z­17.385 A42.168 B67.088

X34.802 Y83.909 Z­15.775 A41.263 B67.784

X36.078 Y82.705 Z­14.154 A40.355 B68.527

X37.389 Y81.431 Z­12.523 A39.443 B69.317

X38.733 Y80.083 Z­10.883 A38.529 B70.157

X40.109 Y78.657 Z­9.238 A37.614 B71.049

X41.514 Y77.147 Z­7.586 A36.699 B71.996

X42.945 Y75.548 Z­5.931 A35.786 B73.001

X44.401 Y73.854 Z­4.274 A34.875 B74.066

X45.878 Y72.06 Z­2.618 A33.969 B75.194

X47.371 Y70.158 Z­0.963 A33.068 B76.389

X48.876 Y68.143 Z0.688 A32.175 B77.653

X50.387 Y66.009 Z2.332 A31.291 B78.991

X51.899 Y63.749 Z3.969 A30.418 B80.406

X53.865 Y60.59 Z6.095 A29.295 B82.381

X55.348 Y58.014 Z7.703 A28.457 B83.989

X56.805 Y55.287 Z9.297 A27.638 B85.691

X58.224 Y52.401 Z10.873 A26.84 B87.491

X59.591 Y49.352 Z12.432 A26.066 B89.393

X60.891 Y46.137 Z13.969 A25.319 B91.399

Исходя из таких реалий, специалисты Группы компаний ADEM разрабатывают постпроцессоры, заменяя недостающие необходимые функции набором открытых команд для управления положением инструмента. В табл. 2 приведена сравнительная таблица УП с наличием команды управления центром инструмента G43.3 и с ее отсутствием.

ПО ADEM изначально формировалось как система, которая берет свои корни из рядовых производственных задач и во главу угла ставит решение проблем, наиболее часто встречающихся именно на производстве. Такой проблемой стал для нас контроль толщины стружки, снимаемой при фрезеровании. Большинство известных САПР для подготовки УП оперируют заданием процента от диаметра инструмента, который соответствует глубине резания. Этим же параметром часто оперируют и поставщики режущего инструмента. Но именно толщина стружки согласно теории резания имеет прямую зависимость с силой резания и величиной подачи на зуб, а следовательно, влияет на процесс резания и режимы обработки. А вот между подачей на зуб и процентом от диаметра инструмента существует тригонометрическая зависимость, а не прямая, как с величиной толщины стружки. Режущая кромка инструмента работает в определенном диапазоне толщин стружки. Если толщина стружки больше, ломается режущая кромка, если меньше — происходит «засаливание» инструмента. Фреза проскальзывает по заготовке, снимает меньше указанной величины толщины стружки и стирается по задней кромке, в связи с чем повышается температура в зоне резания, а следовательно, велика вероятность наклепа поверхностного слоя обрабатываемой заготовки. Кроме того, на современных станках с ЧПУ теперь почти всегда имеется индикация усилия на приводы при обработке. Это, в сущности, и есть сила резания в той или иной плоскости, на которую проецируется вектор силы. Так вот, при обработке по УП, сгенерированной в системе ADEM, усилия резания не имеют резких скачков и находятся в пределах 5% от предыдущего показателя в каждый новый момент. В то же время, при контроле именно процента от диаметра инструмента эти скачки носят внезапный характер и достигают размера в 20%, что станками часто квалифицируется как удар. Это наиболее важно для чувствительных станков с датчиками отслеживания усилия на приводы. Такие станки при резком повышении усилия просто останавливаются в аварийном режиме, что может свести на нет всю осуществленную уже обработку детали. Данная проблема имела место на предприятии ОАО «РСК «МиГ» на трехкоординатных станках Macodel Willemin M920 при обработке пластичной и вязкой нержавеющей стали. При использовании УП от других конкурирующих САМ­систем станок просто останавливался, а в случае применения УП от ADEM станок работал в стабильном режиме с использованием инструмента Sandvik CoroMill 210 (который имеет параметр именно диапазона подачи на зуб, а не процента от диаметра инструмента) и при величине 1700 оборотов шпинделя в минуту показывал результаты в 0,7…0,75 мм/зуб!

Со следующей проблемой специалисты по внедрению ADEM столкнулись на одном из предприятий авиационного машиностроения. Проблема заключалась в отсутствии опции контроля положения инструмента при работе с осями вращения — вывод в УП координат, функционально зависимых от параметров вылета инструмента. Предприятие приобрело пятикоординатный токарно­фрезерный станок с приводным инструментом и качающимся шпинделем. Но станок имел существенный технический изъян — при переключении в режим фрезерования он терял ранее выбранную системы координат детали. То есть фрезерную обработку осуществить было невозможно — сбивались все заданные корректоры на инструмент и терялась траектория, а следовательно, станок начинал бесконтрольно фрезеровать в непредвиденной точке, рискуя осуществить столкновение с недвижимыми узлами в рабочей камере. Для решения проблемы был создан отдельный постпроцессор, который выдавал оператору на стойке с ЧПУ запрос, что нужно заново осуществить обмер детали щупом, задать новую систему координат и внести соответствующие данные в пустые поля запроса. Проблема была решена, хоть и пришлось пожертвовать ощутимым увеличением времени обработки.

Пример моделирования 5х-обработки с использованием измерительных циклов

Еще одна проблемма заключалась в реализации работы с контрольно­измерительными циклами и необходимостью вывода результатов измерения в файл отчета. На одном из предприятий был закуплен пятикоординатный вертикально­фрезерный станок с измерительными датчиками фирмы Renishaw. Номенклатура производства состояла из мелкогабаритных деталей, которых на рабочем столе станка могло разместиться несколько десятков. В связи с этим возникла необходимость осуществлять межоперационный обмер каждой детали, дабы не делать это вручную на столе станка (что отнимает уйму времени, а в некоторые поднутрения сложно «залезть» просто физически) и не снимать детали для обмера контроллером, нарушая тем самым базирование на столе станка и сбивая «ноль детали». Эта задача была успешно решена специалистами ADEM путем создания отдельного постпроцессора с программированием измерительных циклов датчика и генерированием файла отчета. Как результат, на выходе имелась готовая УП для обработки детали и файл отчета с данными по измерению деталей.

Как известно, работа с циклами соответствующей системы ЧПУ позволяет значительно сократить УП и упростить процесс задания и контроля параметров обработки. Также короткая УП значительно легче считывается системой ЧПУ, которая перед наступлением следующего кадра УП успевает дать соответствующую команду на приводы станка. Очередной задачей при программировании обработки циклами было формирование циклов обработки с учетом ini­файлов производителя устройства ЧПУ (а именно — под ShopTurn и ShopMill от Siemens). ShopTurn и ShopMill — интерфейсы системы ЧПУ Siemens для задания циклами токарной и фрезерной видов обработки соответственно. Проблема здесь заключается в том, что с их помощью можно задать обработку только на самом экране стойки. Для того чтобы ShopTurn и ShopMill воспринимали такие же внешние циклы как свои собственные, необходимо перед и после каждого цикла прописывать множество параметров, которые позволят системе ЧПУ сказать — «да, это собственный цикл».

Нередко на предприятиях при покупке нового станка с ЧПУ не представляют, для каких целей он будет использоваться через 1­2 года, когда серия деталей, под производство которых он предназначался, будет завершена. И вообще, любому технологу сложно предвидеть, с какими ограничениями в работе станка он столкнется на каждой новой детали. Особенно это характерно для единичного производства на станках сложной кинематики. Примером такой проблемы служит использование многокоординатного станка с поворотной осью B (вращение инструмента) и поворотной осью C для обработки камеры стыковочного узла космической станции. Ее обработка планировалась на станке с поворотным столом (вращение по оси С) и поворотным шпинделем (вращение по оси В). Но станок имел размер рабочей зоны, которого было недостаточно для размещения столь крупногабаритной детали, а обработать ее нужно было инструментом с большим вылетом, чтобы добраться до всех поднутрений. Тем не менее задача была решена. С помощью постпроцессора было реализовано синхронное движение инструмента одновременно по двум осям: поступательное движение в направлении углубления отверстия и разворот инструмента, чтоб не было столкновения с кромкой отверстия на детали.

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

Разработка CMS с нуля. Часть 4: Семантический адрес или ЧПУ

Добрый день, читатель! Или вечер… не важно, главное что ты заглянул) Сегодня мы продолжим разрабатывать нашу CMS и реализуем такую штуку, как ЧПУ. О том что это, зачем нужно и как работает — все это разберем и на выходе получим новый модуль для нашей системы. Полны вперед!

Итак, для начала, что же такое ЧПУ? Нет, это не «числовое программное управление», как некоторые могли подумать (хотя они, в общем-то, и правы), а СЕМАНТИЧЕСКИЙ адрес. Почему тогда ЧПУ? Просто кто-то когда-то подумал, что «семантический адрес сайта» звучит как-то сложно, и решил назвать «ЧеловекоПонятный Урл». У этого термина есть еще несколько альтернативных названий, но ЧПУ — самый распространенный.

Теперь немного о том, в чем суть использования ЧПУ.
Несемантический адрес выглядит примерно вот так:

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

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

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

Итак, задачи на сегодня:

  • реализовать понимание движком семантических ссылок
  • сделать это в виде модуля
  • работа модуля не должна сказываться на работе логики CMS
  • при включении семантических урл, обыкновенные ссылки должны тоже работать
  • проверить все это дело на простеньких примерах

Пожалуй начнем. Для начала, мы должны создать файл с именем .htaccess, да, именно такое имя, по сути имени нет, только расширение. Это файл конфигурации веб-сервера для конкретного домена. Он нам нужен чтобы описать правило перезаписи, которое послужит основой для работы нашего модуля. Итак, в созданный в корне сайта файл .htaccess пишем следующее:

простое правило, думаю оно вполне понятно. Теперь, когда веб-сервер работает как нужно нам, мы можем приступать к написанию модуля ЧПУ. Начнем конечно же с, уже стандартной проверки и объявления класса, назовем его surl (Semantic URL) и заполним его основным кодом, который требуется для работы с нашим реестром:

этот код нам знаком, понятен и является минимальным каркасом для любого модуля нашей системы. Думаю на этом этапе все понятно. Теперь приступим к функции, которая будет выполнять обработку адреса.
Я достаточно долго думал, смотрел кучу реализаций и комбинировал их так или иначе, но то, что получалось не решало всех поставленных задач, в частности — безопасного включения/отключения модуля, без влияния на систему и поддержку ссылок без семантики при включенных ЧПУ. Взяв самый более-менее годный код из того, что у меня получалось я решил, что его можно допилить до нужного результата. У меня вроде как получилось �� Я подумал, что имеет смысл несколько стандартизировать сам семантический УРЛ и пришел к следующему решению: все адреса нашей системы будут иметь две обязательных части и список параметров, которые могут и отсутствовать, в зависимости от потребностей того или иного скрипта.
Чтоб было понятней, урл будет иметь следующий вид:

Возможно, скорее даже точно, это не самый лучший вариант, но для основной работы самих ЧПУ нам это вполне подходит. Параметр МОДУЛЬ — это не те модули, которые мы сейчас разрабатываем. Это модули внешнего функционала, например модуль новостей или регистрации пользователя. Чтоб вы не путались в будущем. А теперь, как я это реализовал на PHP, поехали.

После объявления переменой с именем класса пишем одну единственную функцию — parseUrl, которая принимает на вход лишь один параметр $type, сообщающий о состоянии ЧПУ: 1 — включен, 0 — выключен.Добавим его чуть позже, а пока начинаем писать саму функцию.

Объявляем функцию и сразу создаем массив, который будет возвращать наша функция с набором наших данных.

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

Если запрашиваемый адрес отличен от корня сайта, парсим его кусок с параметрами и разбиваем по знаку косой черты (слеш). Теперь нам нужно проверить количество параметров в семантическом адресе, их у нас должно быть обязательно четное количество. Минимум — два параметра МОДУЛЬ и ДЕЙСТВИЕ + неограниченное количество пар ПАРАМЕТР и ЗНАЧЕНИЕ. То есть, если количество данных в адресе нечетно, то это значит о том что адрес не верный, а так же еще и то, что запрос возможно идет по несемантическому адресу. Этот момент поясню: чуть выше, после парсинга адреса, мы разбивали его на части и записывали в массив. Разбивали мы по слешу, но что если адрес запрашивается через обычные $_GET параметры? В таком случае в массиве после разбивки мы получим одну запись, например:

да, тут есть два необходимых параметра МОДУЛЬ и ДЕЙСТВИЕ, но т.к. они не в семантическом виде, наша операция разбивки найдет только один слеш — после имени домена — и все кинет в одну ячейку массива. Надеюсь мне удалось донести свою мысль. Если нет — пишите в комменты, помогу разобраться; а пока продолжим. У нас получается всего одна ячейка, 1 — число нечетное, а значит можно попробовать распарсить данные альтернативным методом, при условии что есть что парсить.

Если после целочисленного деления на 2 мы получили остаток, отличный от нуля, то значит количество параметров нечетное, разбиваем то, что есть в массиве по знаку амперсанд (&) и, если в массиве что-то есть, мы получим ассоциативный массив вида ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Мы договорились что обязательно должны присутствовать 2 переменные, значит если их нет, то и нет смысла обрабатывать этот запрос.

Так, проверили, все есть, значит записываем значения в соответствующие ячейки и удаляем эти данные из массива $_GET. После удаления параметров МОДУЛЬ и ДЕЙСТВИЕ, все, что остается — это список параметров для запрашиваемой страницы. Их тоже записываем в наш массив данных но в отдельную ячейку. Ну а если запрос не проходит наши проверки, то и не паримся его обрабатывать.

С альтернативным методом все, теперь возвращаемся к ЧПУ. Если запрос имеет четное количество параметров то первый из них — это МОДУЛЬ, а второй — ДЕЙСТВИЕ. Просто вынимаем их по очереди, удаляя из исходного массива. После этого, в нашем исходном массиве, если что-то и осталось, то это наши параметры для конкретной страницы. Записываем их тоже в наш конечный массив. Все это выглядит следующим образом:

Осталось только закрыть самую первую операцию if в нашей функции и вернуть полученный массив с данными:

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

Ну как? Говорю же, тот же самый код �� Разница лишь в том, что мы не пытаемся разбить строку по слешам, а сразу разбиваем по амперсанду, вот и все. Вот теперь модуль работы с ЧПУ можно назвать готовым, можно приступать к проверкам, но для начала давайте добавим одну переменную в наш с вами конфиг:

Эта переменная будет отвечать у нас за режим работы модуля: 1 — модуль пытается обработать ЧПУ, 0 — обрабатываются обычный, несемантический адрес (хотя по сути, если вы заметили из кода — функция схавает любое число или символ, отличный от единицы, но давайте договоримся использовать 0).

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

Теперь можем проверить как принял наш реестр нового бойца — зайдем на localhost, или другой локальный домен (если вы меняли настройки сервера). Если все пошло как надо, то в списке подключенных модулей мы увидим модуль с именем «ЧПУ». Есть? Замечательно! Теперь проверим непосредственно работу модуля surl . В самый конец файла index.php пишем следующий код:

воспользовавшись нашей функцией parseUrl из модуля surl мы получаем массив с данными из URL-запроса. Сохраните файл index.php и откройте локальный домен. Данных никаких нет — и после строки «Проверка работы ЧПУ:» вы ничего не увидите. А теперь попробуйте вбить, например такой адрес:

Ну как?) Теперь попробуем альтернативный парсер и запросим ту же страницу, но в формате get:

Если все сделано правильно, то класс отработает без ошибок и при запросе обоих ссылок вы увидите, что функция правильно обрабатывает как ЧПУ, так и простые url с get-параметрами. Если отключить ЧПУ в конфге, то будет срабатывать сразу альтернативный парсер.
Итак, что же в итоге:
модуль surl понимает как человекопонятные УРЛы, так и классические ссылки с get-параметрами одинаково; можно отключить обработку ЧПУ и работать только с get-запросами — это не повлияет на логику нашей системы. Поставленные в начале статьи задачи выполнены — я считаю это очередной успешный шаг, давайте себя с этим поздравим ;-P

Конечно, этим все не ограничется. Мы научили нашу CMS только понимать семантические ссылки. Нужен еще как минимум какой-то обработчик, который приняв данные МОДУЛЬ/ДЕЙСТВИЕ/ПАРАМЕТРЫ подгрузит нужный модуль, который запустит необходимое действие с полученными параметрами. Вдобавок, я хочу реализовать так называемые алиасы статичных (не обязательно?) страниц.

По задумке каждая страница будет иметь алиас и храниться он будет в соответствующей таблице БД, а доступ к ней будет возможен как по алиасу, так и по обычной ссылке с get-параметрами. Уф, что-то я вперед уже забегаю, пора остановиться. Кстати, было бы интересно послушать ваши варианты подобной реализации в комментариях, не стесняйтесь. А пока, на этом закончим сегодня. Удачи и до встречи в следующих материалах!

Чпу — Доступ к массивам $_SESSION и $_COOKIES при внедрении ЧПУ.

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

А действительно, зачем это делать? Далеко не каждый человек вообще обращает внимание на адресную строку, тем более пытается там что-то разобрать. Дадим слово гуглу:

Структура URL сайта должна быть предельно простой. Попробуйте организовать контент так, чтобы URL имели логическую структуру и были понятны для человека (по возможности используйте слова, а не идентификаторы, состоящие из множества цифр). Например, при поиске информации об авиации URL типа http://ru.wikipedia.org/wiki/aviacia поможет оценить релевантность ссылки. Гораздо сложнее привлечь внимание пользователей с помощью URL-адреса типа http://www.example.com/index.php? > То есть, применительно к нашему блогу разбиваем url на части:

  • https:// — защищенный протокол передачи данных;
  • upread.ru – домен, адрес блога;
  • blog – раздел, показывающий, что это блог;
  • notes – раздел, показывающий, что это заметки;
  • chpu-s-pomoshhyu-php-dlya-chajnikov – название заметки, которую, собственного говоря, вы и читаете.

Как сделать?

Однако, если в КМС есть уже поддержка ЧПУ, транслитерация и другие инструменты, то, например, на моем блоге этого нет – у меня самописная CMS. Как же реализовано? Все просто, ниже покажу как.

Сначала небольшая ремарка. Если у вас есть какой-то опыт в сайтостроении, но вы не умеете делать ЧПУ с помощью .htaccess и php, то можете подумать, что я создал три каталога, а в них поместил файл index.html. Действительно, в принципе можно сделать каталоги blog, notes и nc-php и в последний положить индексный файл – и это будет работать! Но в реальности никто так не делает, все работают с .htaccess и php.

Итак, для начала нам надо переправить все запросы, которые не являются реальными файлами и каталогами в какой-то определенный файл, чаще всего это корень сайта, но никто вам не мешает создать и любой другой. Например, job.php. Добавьте в ваш .htaccess следующие строки:

Теперь нам надо работать уже с PHP. Я снова возьму в пример свой сайт. Каждый материал на моем блоге доступен по адресу upread/art.php? >
Однако правильнее будет создать в базе данных отдельное поле для ЧПУ каждой записи и сравнивать перед выводом. Кстати, именно так реализован вывод, к примеру, в одной из самых распространенных CMS – WordPress. На картинке видно, что ЧПУ записан в поле post_name, а тот, из которого берется id материала — guid.

После того, как вы создали ЧПУ на своем сайте, вы можете увидеть, что у вас слетели стили. Почему так происходит? Все просто: если прописаны относительные пути к стилям скриптам, то браузер и пытается их загрузить из текущей директории. А не находя, естественно, выдает ошибку 404. Решается проблема просто: добавляем тэг base. Например, для моего блога он выглядит таким образом:

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

PHP Основы

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

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

Без спору, PHP является более сложным языком, чем, например, JavaScript. Но прислушайтесь к моему мнению, ведь я достиг определённого уровня в 11-ти (!) языках программирования. Уверяю Вас: главное — это начать, а дальше всё пойдёт как по маслу. И очень важно — это правильно начать, начать с простых вещей и двигаться от простого к сложному. И в этом-то и поможет данная категория сайта. Прочитав предложенные здесь материалы и приложив хоть немного усилий, чтобы применить полученные знания на практике, Вы поймёте, что я был прав.

В силу вышесказанного, не надо бояться изучения PHP, и смело приступайте к знакомству с ним — Вы не пожалеете, гарантирую!

Прочитав статьи по основам PHP, Вы узнаете:

1) Почему не работает PHP.

2) Как создавать домены и поддомены в пакете Denwer.

3) Код простейшей программы Hello World на PHP.

4) Как создавать переменные в PHP.

5) Об условном операторе в PHP.

6) Что такое ссылочные переменные в PHP.

7) Как создать константы в PHP.

8) Зачем нужен оператор эквивалентности в PHP.

9) О создании и переборе массивов в PHP.

10) Об отладочной функции в PHP.

11) Как подключить в PHP сторонний файл.

12) О разбиении и объединении строк в PHP.

13) Как создать функцию в PHP.

14) Как обработать форму в PHP.

15) Какие математических функции имеются в PHP.

16) Какие строковые функции имеются в PHP.

17) Как работать с датой и временем в PHP.

18) Как работать с массивами в PHP.

19) О MD5 хэширование в PHP.

20) Как работать с файлами в PHP.

21) О чтении INI-файлов в PHP.

22) Реализации редиректа на PHP.

23) Как работать с cookie в PHP.

24) Как работать с сессиями в PHP.

25) Как отправить e-mail через PHP.

26) Как создать класс в PHP.

27) О наследовании классов в PHP.

28) Об абстрактных классах в PHP.

29) О модификаторах доступа в PHP.

30) Об интерфейсах в PHP.

31) О методе toString() в PHP.

32) Как использовать DirectoryIndex в .htaccess.

33) Как установить модуль cURL на Denwer.

34) Какие возможности предоставляет модуль cURL.

35) Как работать в PHP с cURL.

36) Как узнать HTTP-заголовки сервера через cURL.

37) Как отправлять POST-запросы в cURL.

38) Как отправлять GET-запросы в cURL.

39) Какая разница между POST и GET.

40) Как проводить тестирование PHP-кода через cURL.

41) Как отправлять cookie через cURL.

42) Как отправлять referer через cURL.

43) Как узнать IP-адрес посетителя через PHP.

44) Как узнать страну по IP-адресу через PHP.

45) О глобальном массиве $_SERVER в PHP.

46) Как загрузить файл в PHP.

47) Как обеспечить безопасность при загрузке файлов в PHP.

48) Как загружать файлы больших размеров в PHP.

49) Как создавать изображения в PHP.

50) Как рисовать в PHP графические примитивы.

51) Как залить замкнутую область в PHP.

52) Как загрузить изображение из файла в PHP.

53) Как залить изображение текстурами в PHP.

54) Как узнать цвет пикселя изображения в PHP.

55) Как рисовать текст в PHP.

56) Как рисовать русский текст в PHP.

57) Что такое регулярные выражения и где они используются.

58) Какие функции для работы с регулярными выражениями используются в PHP.

59) Какие метасимволы используются при составлении регулярных выражений.

60) Какие квантификаторы повторений используются при составлении регулярных выражений.

61) Какие спецсимволы используются при составлении регулярных выражений.

62) Какие модификаторы используются при составлении регулярных выражений.

63) Примеры регулярных выражений.

64) Как продлить время жизни сессии в PHP.

65) Как узнать страну посетителя по его IP-адресу через базу данных.

66) Как просмотреть AVI-файл на сайте.

67) Как установить ffmpeg на Denwer.

68) Что такое API.

69) Как конвертировать AVI в FLV на сервере.

70) Как сделать регистрацию и авторизацию пользователей на сайте.

71) Какая разница между cookie и сессиями.

72) Как реализовать поиск на сайте через PHP.

73) Как создать движок для сайта.

74) Как создать Admin-панель для сайта.

75) Функции для работы с каталогами в PHP.

76) Как удалить каталог с файлами в PHP.

77) Что такое права доступа к файлам.

78) Какие функции имеются в PHP для работы с правами доступа к файлам.

79) Как создать свой API на сайте.

80) Как использовать файлы TPL.

81) Как задать кодировку в файле htaccess.

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

83) Как реализовать Кто онлайн.

84) Как сделать голосование на сайте.

85) Как сделать ЧПУ-ссылки на PHP.

86) Как спрятать содержимое директории на сайте.

87) Об основном инструменте поиска ошибок в коде.

88) Как работать с XML-документом в PHP.

89) Как создать социальную сеть.

90) Как блокировать доступ к сайту по IP-адресу.

91) Как закрыть сайт на реконструкцию.

92) О директиве register_globals.

93) Как убрать конфликт между Denwer и Skype.

94) О «жадных» или «ленивых» квантификаторах повторений в регулярных выражениях.

95) О «сверхжадных» или «ревнивых» квантификаторах повторений в регулярных выражениях.

96) Как создать ZIP-архив на PHP.

97) Как извлечь ZIP-архив на PHP.

98) Как узнать время работы скрипта на PHP.

99) Как динамически выводить данные в PHP-скрипте.

100) Об использовании cron.

101) Что лучше: готовый движок или сайт с нуля.

102) Как оптимизировать PHP-код.

103) Что такое сокет в PHP.

104) Как написать сокет-сервер на PHP.

105) Как написать сокет-клиент на PHP.

106) Как сделать мультиязычный сайт на PHP.

107) Как сделать навигацию по страницам на PHP.

108) Как сделать комментирование на сайте.

109) О практике использования tpl-файлов.

110) Как сделать тестирование на сайте.

111) Как сделать страницу пользователя.

112) Как сделать приём оплаты на сайте.

113) Как генерировать PDF на PHP.

114) Как генерировать PDF на PHP с использованием TCPDF.

115) Как генерировать XLS на PHP.

116) Как запускать PHP-код.

117) Как обезопасить сайт.

118) Как отключить кэширование на PHP.

119) Что такое статические методы и свойства в ООП.

120) Что такое фреймворк.

121) Как сделать типы пользователей на PHP.

122) Как сделать чат на PHP.

123) Что такое DOM.

124) Как сохранять и загружать XML-документы через DOM.

125) Как получить список дочерних узлов через DOM.

126) Как работать с атрибутами узлов в XML-документе.

127) Как создать XML-документ в PHP.

128) Как парсить XML-документ на PHP.

129) Как сделать подписку на сайте.

130) Почему не работает Denwer.

131) Почему появляется «абракадабра» на сайте.

132) Как построить график на PHP.

133) Как создать капчу с арифметическими операциями.

134) Как сделать свой сервер для сайта.

135) Как склонять слова на PHP.

136) О циклах в PHP.

137) Какая проблема связки PHP и HTML.

138) Что такое MVC.

139) О компонентом подходе в PHP.

140) Как создать генератор паролей на PHP.

141) Как правильно осваивать PHP.

142) Как работать с FTP через PHP.

143) Как найти все ссылки на странице через PHP.

144) О функциях форматного вывода в PHP.

145) О функции sscanf() в PHP.

146) Как вывести различные уровни ошибок в PHP.

147) О функциях для работы с DNS.

148) Как реализовать кэширование на PHP.

149) Как вывести все картинки из папки на PHP.

150) Как проверить дату на корректность в PHP.

151) Как создавать динамические функции на PHP.

152) Как правильно шифровать пароли пользователей на сайте?

153) Как генерировать уникальный ID на PHP.

154) Как запустить PHP-функцию нажатием по ссылке.

155) Как определить браузер пользователя через PHP.

156) Как вывести случайный элемент из массива в PHP.

157) Что такое рекурсия и как её использовать в PHP.

158) Как правильно изучать PHP и MySQL.

159) Как удалить GIF-анимацию в PHP.

160) Как получить Видеокурс по PHP и MySQL.

161) Как получить бесплатный Видеокурс по основам PHP.

162) Как правильно экранировать регулярное выражение.

163) Как настроить HTTPS-соединение.

164) Как настроить часовой пояс через htaccess.

165) Как удалить/добавить слэш в конце URL.

166) Как исправить ошибку «Cannot modify header information — headers already sent«.

167) Как создать объект по имени класса в PHP.

168) Об ошибке «Function fetch_assoc() on a non-object«.

169) Как обрезать изображение в PHP.

170) Как создать файл .htaccess.

171) Как узнать, сколько изменилось строк после UPDATE или DELETE.

172) Как масштабировать изображение в PHP.

173) Как сделать статистику посещений на PHP.

174) О коде шаблонизатора в PHP.

175) О классе для работы с базой данных.

176) Как строить графики на PHP.

177) Как вывести время с учётом часового пояса в PHP.

178) Как определить часовой пояс пользователя.

179) Как отсортировать двумерный массив на PHP.

180) Как загрузить изображения с других сайтов на PHP.

181) Как сделать систему рефералов на PHP.

182) Что такое рефакторинг.

183) Как проводить рефакторинг.

184) Как сохранять данные в форме.

185) Как сделать улушенную версию подписки на обновления.

186) Как убрать index.php из URL.

187) Как обработать ошибки на PHP.

188) Как скрыть URL скачиваемого файла на PHP.

189) Когда использовать POST, а когда GET.

190) Как сделать поиск по файлам на PHP.

191) О глобальных переменных в PHP.

192) Как сделать мониторинг сервера.

193) Об операторе подавления ошибок в PHP.

194) Что такое gzip.

195) Стоит ли использовать gzip.

196) Как сделать смайлы в комментариях.

197) Как определить язык пользователя на PHP.

198) Как заблокировать пользователя на сайте.

199) О функции __autoload() в PHP.

200) Как сделать одноразовую авторизацию по ссылке.

201) Как сделать капчу с обновлением.

202) Как определить реальный IP-адрес посетителя.

203) Как «подружить» русский язык и регулярные выражения.

204) Как отменить повторную отправку формы.

205) Как удалить GET-параметр из URL.

206) Как сделать фильтр поиска на PHP.

207) Как сделать Pagination на PHP.

208) Как работать с API ВКонтакте.

209) Как отправлять SMS на сайте.

210) Как работать с HTML-массивами в PHP.

211) О механизме исключений в PHP.

212) Как создавать собственные исключения в PHP.

213) Как удалить координаты в GET у кнопки image.

214) Как защититься от постоянных нажатий F5.

215) Как сделать парсер контента на PHP.

216) Как перевести русский текст в транслит на PHP.

217) Как работать с whois через PHP.

218) Как сделать многоуровневое меню на PHP и MySQL.

219) Как склонять имена по падежам через PHP.

220) Как запретить доступ к файлам через mod_rewrite.

221) Про использование RewriteCond в mod_rewrite.

222) Как сделать ЧПУ-ссылки на mod_rewrite.

223) Как сделать счётчик обращений к файлам с помощью mod_rewrite.

224) Как сделать графический счётчик на PHP.

225) Как вывести MP3-файлы на PHP.

226) Как сделать сокращение URL на PHP.

227) Как сделать систему лайков на PHP.

228) Как защитить e-mail на сайте от спамеров.

229) Что такое пространства имён.

230) Как захэшировать пароль с помощью Hash API.

231) Что нового появилось в PHP 5.5.

232) Что такое PDO.

233) Основные методы для работы с данными в PDO.

234) Подготовленные запросы, отлавливание ошибок и транзакции в PDO.

235) Как написать сокращатель URL? Часть 1.

236) Зачем нужен шаблон проектирования «Одиночка».

237) Зачем нужен шаблон проектирования «Стратегия».

238) Зачем нужен шаблон проектирования «Фабрика».

239) Как написать сокращатель URL? Часть 2.

240) Как написать сокращатель URL? Часть 3.

241) Что такое анонимные, или лямбда-функции в PHP.

242) Зачем нужен пакетный менеджер composer.

243) Что такое фильтры в PHP.

244) Что такое Reflection API? ReflectionClass.

245) Что такое Reflection API? Reflection Method.

246) Что такое Reflection API? Reflection Property.

247) Что такое Reflection API? Reflection Parameter.

248) Что такое Reflection API? Reflection Object.

249) Зачем нужен шаблон проектирования «Адаптер».

250) Зачем нужен шаблон проектирования «Фасад».

251) Как создать движок на MVC? Введение.

252) Как создать движок на MVC? Пишем роутер.

253) Как создать движок на MVC? Дорабатываем роутер.

254) Как подключать классы с использованием spl_autoload.

255) Сериализация объектов в PHP.

256) Как создать движок на MVC? Выводим страницы. Часть 1.

257) Как работать с GitHub (1/3).

258) Как создать движок на MVC? Выводим страницы. Часть 2.

259) Как работать с GitHub (2/3).

260) Как работает функция array_pad в PHP.

261) ООП против процедурного подхода в PHP.

262) Как работать с GitHub (3/3).

263) Как создать движок на MVC? Выводим страницы. Часть 3.

264) Как сделать авторизацию пользователей через Facebook на PHP.

265) Как создать движок на MVC? Выводим страницы. Часть 4.

266) Как создать движок на MVC? Начинаем работу с базой данных.

267) Как научиться печатать 10-ю пальцами, не глядя на клавиатуру.

268) Как создать движок на MVC? Создаем авторизацию.

269) Как создать движок на MVC? Создаем чат.

270) Как создать движок на MVC? Продолжаем работу над чатом.

271) Как создать движок на MVC? Заканчиваем работу с чатом.

272) Как создать движок на MVC? Начинаем делать систему распределения прав пользователей.

273) Как создать движок на MVC? Создаем возможность добавления пользователя через админ панель.

274) Как создать движок на MVC? Делаем возможность редактирования и удаления пользователей из базы данных.

275) Как создать движок на MVC? Улучшаем систему шифровки пароля пользователей.

276) Как обновить PHP на Denwer.

277) PHP: безопасность. Хранение данных в cookies.

278) PHP: безопасность. Отображение ошибок.

279) PHP: безопасность. Подключение файлов.

280) PHP: безопасность. Что такое XSS.

281) Как создать социальную сеть на PHP: вступление.

282) Как создать социальную сеть на PHP: подготовка проекта.

283) Как создать социальную сеть на PHP: вывод домашней страницы.

284) Новинки в PHP7. Часть 1.

285) Новинки в PHP7. Часть 2.

286) Новинки в PHP7. Часть 3.

287) Новинки в PHP7. Часть 4.

288) Новинки в PHP7. Часть 5.

289) Новинки в PHP7. Часть 6.

290) Новинки в PHP7. Часть 7.

291) Некоторые советы по написанию условий в PHP.

292) Как использовать интерфейс countable в PHP.

293) Полезные советы по использованию Git.

294) Что нового в PHP7.1: обнуляемые типы.

295) Что нового в PHP7.1: улучшения для деконструкции массивов.

296) Что нового в PHP7.1: ключевое слово void.

297) Что нового в PHP7.1: видимость констант.

298) Что нового в PHP7.1: работа с группой исключений.

299) Что нового в PHP7.1: генерация случайных чисел.

300) Что нового в PHP7.1: новые сообщения об ошибках.

301) Что нового в PHP7.1: улучшения обработки $this.

302) Для чего используется PHP фреймворк Slim Framework.

303) Что такое стандарты PSR.

304) Как провести модульное тестирование в PHP средствами PHPUnit.

305) Как создавать форму обратной связи на PHP с отправкой на e-mail.

306) Как сделать верстку форму обратной связи используя Bootstrap.

307) Как использовать внедрение зависимостей в PHP.

308) Зачем использовать сервер Memcached в PHP.

309) Как подключить PHP файлы к MySQL базе данных.

310) Что такое потоки в PHP.

311) Как получить метаданные потока в PHP.

312) Чем интересны итераторы в PHP.

313) Как использовать интерфейс ArrayAccess в PHP.

314) Как логировать сообщения приложения в PHP с помощью Zend Log.

315) О источниках сохранения логов в Zend Log.

316) Что такое магические методы в PHP.

317) Что такое ORM в PHP.

318) Как читать RSS-ленту в PHP.

319) Что такое генераторы в PHP.

320) Как использовать трейты в PHP.

321) Как установить UTM метки на сайте через PHP.

322) Как установить UTM метки на сайте через PHP. Часть 2.

323) Как сделать мультилендинг.

324) Что такое динамический веб-сайт?.

Статьи

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

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

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

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

Итак, операторы без компьютерных навыков и технологи-программисты без опыта работы на ручных металлообрабатывающих станках бесполезны, они должны в процессе работы наверстать упущенное и приобрести недостающие им навыки. Это обязательные составляющие успеха производства в целом. Далее речь пойдет об инструменте. Современный металлорежущий инструмент ведущих мировых компаний, таких как Sandvik Coromant,Iskar,Mitsubishi и др. постоянно совершенствуется, буквально каждый месяц. Технологии быстро изменяются. То, что было актуально несколько месяцев назад сейчас уже потеряло всякий смысл. Например, твердосплавные сверла не требуют предварительной центровки, резьбы преимущественно нарезаются не метчиками, а резьбофрезами и прочее. Поэтому очень важно постоянно отслеживать тенденции в инструментальной области для применения самых современных технологий.

Далее о СAD\CAM. К сожалению, на конец 2008 года лишь малая часть предприятий, заводов использующих недавно закупленные современнейшие импортные станки ЧПУ вообще представляют что такое CAD\CAM и для чего оно вообще нужно. Руководители считают, что это очень накладно покупать такие дорогие программы как ProEngeneir,Mastercam ,Solidcam или SolidEdge, предполагаю, по-видимому, что заводские “Кулибины” и так запрограммируют станки вручную. Это величайшее невежество, которое, скорее всего, будет постепенно исправляться в ближайшие годы. Я предполагаю бурный рост рынка продаж CAD\CAM в России в ближайшие несколько лет. СAD\CAM не просто упрощает написание программ, а убыстряет процесс реально тысячекратно, а многие технологии, такие как 3D фрезеровка вообще невозможны без такого программного обеспечения. Единственная сфера где применение СAD\CAM действительно бессмысленно — это простая токарная обработка ЧПУ , где действительно оператор в тоже самое время одновременно является и программистом, используя встроенные в стойку системы типа Easy Guide, Manual Guide и им подобные. В этом случае гораздо выгодней обучить этим системам операторов, чем покупать отдельный пакет CAD\CAM и содержать программистов. Во всех других случаях применение CAD\CAM является оправданным и даже необходимым. Один программист, мастерски владеющий Мastercam может обеспечивать бесперебойную работу участка из 5-15 станков ЧПУ ,при этом экономя массу времени, недель отладки управляющих программ вручную.

Какой смысл покупать станки затрачивая более чем 1 миллион долларов, в то же время, экономя еще 20 тысяч при этом теряя до 90% эффективности купленных станков? Однако на сегодняшний день эта абсурдная ситуация является обыденной в России. Возможно, эта статья найдет своего читателя и поможет разобраться в данном вопросе. Теперь разберемся, кто же наиболее подходит для работы на станках ЧПУ и как подбирать персонал? С одной стороны- пожилые станочники с хорошими практическими навыками ручной металлообработки, с другой-молодые люди, свободно владеющие персональным компьютером, но не имеющие навыков металлообработки, желающие получить профессию и работать на участках с ЧПУ? Скорее всего, для нового участка ЧПУ с импортными станками следует подбирать нечто среднее, например рабочих имеющих уже опыт работы на старых отечественных ЧПУ , а также молодых людей, желающих карьерного роста, быстрообучаемых, но не обладающих достаточным опытом практической работы. Трехдневного интенсивного курса, проведенного опытным инструктором прямо на рабочем месте вполне достаточно для начала самостоятельной работы в качестве оператора современного импортного станка ЧПУ .

С другой стороны, всеx принятыx на работу в качестве технологов-программистов ЧПУ я бы порекомендовал обязывать проходить курс ручной металлообработки в целях получения практического опыта. Работая в Западных компаниях я часто сталкивался с тем, что при приеме на работу в качестве программиста ЧПУ я должен был практически доказать что я владею ручной металлообработкой. В качестве теста предлагалось изготовить простую деталь на ручном станке! В случае успешного прохождения теста меня допускали к работе уже на станке ЧПУ , где я также должен был продемонстрировать навыки практической металлообработки. И только после этого я приступал непосредственно к своим обязанностям в качестве программиста ЧПУ . Такая практика не используется пока в России, но можно предположить, что эти времена не за горами. Итак, подведем итоги этой краткой статьи. Успех внедрения новейших импортных станков ЧПУ зависит от множества факторов, таких как:

1. Квалификация персонала (компьютер+станок)
2. Современный режущий инструмент
3. Программное обеспечение CAD\CAM

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

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

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

Также нужно знать, что всё что находится за символом «#» является комментарием, т.е сервер пропускает мимо всё, что находится за этим символом. Комментариями нужно пользоваться свободно, чтобы потом можно было быстро вспомнить, как это правило работает и для чего его вообще написали. Также в каждом файле «.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/ >

Как используются регулярные выражения для преобразования 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 . trimM >= function ( )
// убирает все пробелы в начале и в конце строки
// помимо этого заменяет несколько подряд
// идущих пробелов внутри строки на один пробел
<
var r = / \s\s + / g ;
return this . trim ( ) . replace ( r , ‘ ‘ ) ;
>

function SetTranslitRuToLat ( ) <
var text = document . getElementBy >( ‘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 . trimM >( ) ;

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 . getElementBy >( ‘name’ ) . value = newString . toLowerCase ( ) ;
>

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

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

Цукерберг рекомендует:  11 причин связать свою жизнь с программистом
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих