Ruby On Rails и SEO url или как на рельсах поддерживать СЕО адреса

При изучение Ruby on Rails в одной из глав знакомишься с организацией routes в Rails. Весь принцип построения ресурсов выглядит продуманно и красиво. В концепции построение url фигурируют понятные и удобные для программиста ID (как правило integer типа).
Например, одна строка

resources :photos
создает сразу целый набор url:
Метод HTTP Путь Экшн Использование
GET /photos index отображает список всех фото
GET /photos/new new возвращает форму HTML для создания нового фото
POST /photos create создает новое фото
GET /photos/:id show отображает определенное фото
GET /photos/:id/edit edit возвращает форму HTML для редактирования фото
PATCH/PUT /photos/:id update обновляет определенное фото
DELETE /photos/:id destroy удаляет определенное фото

Данный способ прост и логичен для быстрой разработке прототипа. Такой подход понятен и логичен для разработчика. По одному url понятно какой controller и action отвечает за функционал. После перехода проекта в стадию продвижения, за дело берутся SEO специалисты проверяя сайт по своему чек листу.

Одна из первых переделок проекта - это переделка уролов на так называемые ЧПУ (человека понятные урл).
Например http://site.ru/foto/priroda/zavat
Изначально концепция предполагала, что пользователю легче это запомнить и набрать, чем адрес вида
http://site.ru/?cid=1&id=2

Я мало верю в то, что сейчас пользователи набирают полные адреса страниц на память. Скорей они используют поисковые системы. А вот поисковые системы, по словам СЕО спецов, дают плюс 100 в карму сайта если у них в адресе страницы присутствуют ключевые слова.

Вот тут и понадобиться более подробно познакомиться с функционалом routes в Rails

Примеры красивых URL первого уровня

Перед нами задача организовать красивые урл для страниц разных по типу, но имеющий одинаковый принцип именования
Примеры:
http://сигачев.рф/как_изучить_руби - статья из блога
http://сигачев.рф/отдых_на_выходных - Категория из каталога фото
http://сигачев.рф/фантастика - категория из каталога книг

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

  match '/:name' => 'pages#show',       :constraints => PageNameConstraint.new, :as => :seo_page
  match '/:name' => 'photo#category',  :constraints => PhotoCategoryConstraint.new, :as => :seo_photo_category
  match '/:name' => 'book#category',   :constraints => BookCategoryConstraint.new, :as => :seo_book_category

Для работы нам потребуется определить три класса, которые фигурируют в условиях
class PageNameConstraint
  def matches?(request)
    @page = Page.find_by_name request.path_parameters[:name]
    !@page.nil?
  end
end

class PhotoCategoryConstraint
  def matches?(request)
    @category = PhotoCategory.find_by_name request.path_parameters[:name]
    !@category.nil?
  end
end


class BookCategoryConstraint
  def matches?(request)
    @category = BookCategory.find_by_name request.path_parameters[:name]
    !@category.nil?
  end
end

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

Субдомены и приложение Rails

Не редко возникает необходимость вынести часть функционала сайта на домен третьего уровня. Здесь встает вопрос как управлять routes и как их различать, например, индекс для основного сайта и для сайта на домене третьего уровня.
class BookSubdomain
  def self.matches?(request)
    !!request.subdomain && request.subdomain =~ /^book\b/
  end
end
....
constraints(BookSubdomain) do
   match '/' => 'index#book',  :as => :book
end

Условия не ограничиваются только проверкой доменов и могут быть составными
match '/:category/page-(:page)' => 'book#show',
                                       :constraints => {:subdomain => /book.*/, :category => /fantasi|detectiv/, :page => /\d+/}

Данное правило сработает есть выполнятся условия:
  • субдомен будет начинаться на book
  • категория будет содержать подстроку fantasi или detectiv
  • номер страницы будет числом

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

Вам может понравиться