Статьи

Начните SEO прямо с Sitemaps на Rails

После создания вашего сайта следующим шагом обычно является забота об оптимизации поисковых систем (SEO). Имея это в виду, создание карты сайта является одной из задач, которые вам необходимо решить. Согласно протоколу , файлы Sitemap представляют собой XML-файлы в кодировке UTF-8, которые описывают структуру вашего сайта. Они довольно простые, но для больших сайтов создание их вручную не вариант. Поэтому это разумный шаг для автоматизации создания карт сайта.

Существует множество решений для Rails по созданию файлов Sitemap, но я предпочитаю гем под названием sitemap_generator . Он активно поддерживается и имеет ряд интересных функций:

  • Он не зависит от фреймворка, поэтому вы можете использовать его без Rails
  • Это очень гибкий
  • Он имеет собственный файл конфигурации и не привязан строго к маршрутам вашего приложения
  • Позволяет автоматически загружать карты сайта в стороннее хранилище.
  • Он автоматически проверяет поисковые системы при создании новой карты сайта
  • Он поддерживает несколько файлов Sitemap и различные типы файлов Sitemap (видео, новости, изображения и т. Д.).

В этой статье мы увидим SitemapGenerator в действии, интегрировав его в пример приложения Rails и обсудив его основные функции. Я также объясню, как экспортировать карты сайта в облачное хранилище, чтобы все работало правильно на платформах, таких как Heroku.

Исходный код этой статьи доступен на GitHub .

Создание примера сайта

Как обычно, начните с создания нового приложения Rails:

$ rails new Sitemapper -T 

Я буду использовать Rails 5.0.1, но SitemapGenerator работает практически с любой версией.

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

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

 $ rails g model Category title:string $ rails g model Post category:belongs_to title:string body:text $ rails db:migrate 

Убедитесь, что на моделях установлены правильные ассоциации:

модели / category.rb

 [...] has_many :posts, dependent: :destroy [...] 

модели / post.rb

 [...] belongs_to :category [...] 

Теперь давайте настроим несколько маршрутов. Чтобы сделать вещи немного интереснее, я сделаю их вложенными:

конфиг / routes.rb

 [...] resources :categories do resources :posts end [...] 

Также, пока мы здесь, добавьте корневой маршрут:

конфиг / routes.rb

 [...] root to: 'pages#index' [...] 

Теперь создайте контроллеры. Нам не нужны какие-либо действия внутри, поэтому они будут очень простыми:

categories_controller.rb

 class CategoriesController < ApplicationController end 

posts_controller.rb

 class PostsController < ApplicationController end 

pages_controller.rb

 class PagesController < ApplicationController end 

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

Загрузка данных образца

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

Gemfile

 [...] group :development do gem 'faker' end [...] 

Установите это:

 $ bundle install 

Теперь измените файл db / seeds.rb :

дБ / seeds.rb

 5.times do category = Category.create({ title: Faker::Book.title }) 5.times do category.posts.create({ title: Faker::Book.title, body: Faker::Lorem.sentence }) end end 

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

 $ rails db:seed 

Ницца! Подготовка завершена, так что давайте перейдем к основной части.

Интеграция Sitemap Generator

Добавьте драгоценный камень, который мы используем в Gemfile :

Gemfile

 [...] gem 'sitemap_generator' [...] 

Установите это:

 $ bundle install 

Чтобы создать пример файла конфигурации с полезными комментариями, используйте эту команду:

 $ rake sitemap:install 

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

конфиг / sitemap.rb

 SitemapGenerator::Sitemap.default_host = "http://www.example.com" 

Обратите внимание, что этот гем также поддерживает несколько имен хостов .

Основные инструкции для SitemapGenerator следует размещать внутри блока, передаваемого SitemapGenerator::Sitemap.create . Например, давайте добавим ссылку на наш корневой путь:

конфиг / sitemap.rb

 SitemapGenerator::Sitemap.create do add root_path end 

Метод add принимает несколько аргументов . Укажите, что корневая страница обновляется ежедневно:

конфиг / sitemap.rb

 add root_path, :changefreq => 'daily' 

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

конфиг / sitemap.rb

 [...] Category.find_each do |category| add category_posts_path(category), :changefreq => 'weekly', :lastmod => category.updated_at category.posts.each do |post| add category_post_path(category), :changefreq => 'yearly', :lastmod => post.updated_at end end [...] 

Обратите внимание, что здесь я также предоставил опцию :lastmod чтобы указать, когда страница обновлялась в последний раз (значение по умолчанию — Time.now ).

Запуск генератора и проверка файлов Sitemap

Чтобы сгенерировать новую карту сайта (или обновить существующую), выполните следующую команду:

 $ rails sitemap:refresh 

Обратите внимание, что если по какой-либо причине карта сайта не будет сгенерирована, старая версия не будет удалена. Еще одна важная вещь, которую нужно помнить, это то, что скрипт автоматически пингует поисковые системы Google и Bing, чтобы уведомить, что доступна новая версия карты сайта. Вот пример вывода из команды выше:

 + sitemap.xml.gz 1 sitemap / 251 Bytes Sitemap stats: 62 links / 1 sitemap / 0m01s Pinging with URL 'http://www.example.com/sitemap.xml.gz': Successful ping of Google Successful ping of Bing 

Если вам нужно SitemapGenerator::Sitemap.search_engines дополнительные движки, вы можете изменить хэш SitemapGenerator::Sitemap.search_engines . Также вы можете опустить пинг поисковых систем, сказав

 $ rails sitemap:refresh:no_ping 

Сгенерированные карты сайта будут помещены в публичный каталог с расширением .xml.gz . Вы можете извлечь этот файл и просмотреть его в любом текстовом редакторе. Если по какой-то причине вы не хотите, чтобы файлы были сжаты с помощью GZip, установите для параметра SitemapGenerator::Sitemap.compress значение false .

Теперь, когда у вас есть карта сайта, файл public / robots.txt должен быть изменен, чтобы предоставить ссылку на него:

общественности / robots.txt

 Sitemap: http://www.example.com/sitemap.xml.gz 

SitemapGenerator может создавать индексный файл в зависимости от того, сколько ссылок содержит ваша карта сайта. По умолчанию (опция :auto ), если существует более 50 000 ссылок, они будут разделены на разные файлы, а ссылки на них будут добавлены в индекс. Вы можете контролировать это поведение, изменив параметр SitemapGenerator::Sitemap.create_index . Другие доступные опции — true (всегда генерировать индекс) и false (никогда не генерировать индекс).

Если вы хотите добавить ссылку непосредственно в индексный файл , используйте метод add_to_index который очень похож на метод add .

Несколько локалей

Теперь предположим, что наш блог поддерживает два языка: английский и русский. Установите английский язык в качестве локали по умолчанию, а также настройте параметр available_locales :

конфиг / application.rb

 [...] config.i18n.default_locale = :en config.i18n.available_locales = [:en, :ru] [...] 

Теперь рассмотрим маршруты:

конфиг / routes.rb

 [...] scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do resources :categories do resources :posts end root to: 'pages#index' end [...] 

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

конфиг / sitemap.rb

 [...] {en: :english, ru: :russian}.each_pair do |locale, name| group(:sitemaps_path => "sitemaps/#{locale}/", :filename => name) do add root_path(locale: locale), :changefreq => 'daily' Category.find_each do |category| add category_posts_path(category, locale: locale), :changefreq => 'weekly', :lastmod => category.updated_at category.posts.each do |post| add category_post_path(category, post, locale: locale), :changefreq => 'yearly', :lastmod => post.updated_at end end end end [...] 

Идея очень проста. Мы создаем каталог public / sitemaps, который содержит папки ru и en . Внутри находятся файлы english.xml.gz и russian.xml.gz . Я также поручаю сценарию всегда генерировать индексный файл:

конфиг / sitemap.rb

 [...] SitemapGenerator::Sitemap.create_index = true [...] 

Развертывание в Heroku

Наш сайт готов к развертыванию, однако есть проблема: Heroku не позволяет нам сохранять пользовательские файлы. Поэтому мы должны экспортировать созданную карту сайта в облачное хранилище. Я буду использовать Amazon S3 для этой демонстрации, поэтому добавьте новый гем в Gemfile :

Gemfile

 [...] gem 'fog-aws' [...] 

Установите это:

 $ bundle install 

Теперь нам нужно предоставить специальную конфигурацию для SitemapGenerator, объясняющую, куда экспортировать файлы:

конфиг / sitemap.rb

 [...] SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new(fog_provider: 'AWS', aws_access_key_id: 'KEY', aws_secret_access_key: 'SECRET', fog_directory: 'DIR', fog_region: 'REGION') SitemapGenerator::Sitemap.public_path = 'tmp/' SitemapGenerator::Sitemap.sitemaps_host = "https://example.s3.amazonaws.com/" SitemapGenerator::Sitemap.sitemaps_path = 'sitemaps/' [...] 

SitemapGenerator::S3Adapter.new содержит конфигурацию для S3. Чтобы получить пару ключей, необходимо войти на сайт aws.amazon.com и создать учетную запись с разрешением на чтение / запись для доступа к службе S3. Не публично выставлять эту пару ключей! Также создайте корзину S3 в выбранном регионе (по умолчанию используется us-east-1 ).

Далее мы устанавливаем tmp/ для опции public_path — это каталог, в котором файл будет изначально создан перед экспортом в S3.

sitemaps_host должен содержать путь к вашей корзине S3.

sitemaps_path — это относительный путь внутри вашего сегмента.

Еще немного информации об этой конфигурации можно найти на этой странице .

Другая проблема заключается в том, что некоторые платформы (например, Bing) требуют, чтобы карты сайта находились в одном домене, поэтому мы должны позаботиться и об этом. Давайте добавим маршрут /sitemap в наше приложение, которое просто выполнит перенаправление на S3:

конфиг / routes.rb

 [...] get '/sitemap', to: 'pages#sitemap' [...] 

Соответствующее действие:

pages_controller.rb

 [...] def sitemap redirect_to 'https://example.s3.amazonaws.com/sitemaps/sitemap.xml.gz' end [...] 

Как вы помните, по умолчанию SitemapGenerator будет пинговать поисковые системы, но предоставит прямую ссылку на S3, а это не то, что нам нужно. Используйте метод ping_search_engines чтобы переопределить это поведение:

конфиг / sitemap.rb

 [...] SitemapGenerator::Sitemap.ping_search_engines('http://example.com/sitemap') [...] 

Обратите внимание, что теперь вам нужно сгенерировать карту сайта, запустив

 $ rake sitemap:refresh:no_ping 

потому что в противном случае SitemapGenerator будет пинговать поисковые системы как по прямой ссылке, так и по адресу http://example.com/sitemap .

Наконец, обновите файл robots.txt, добавив новую ссылку:

общественности / robots.txt

 Sitemap: http://www.example.com/sitemap 

Вот и все, теперь ваш сайт готов к публикации в Heroku!

Вывод

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

Спасибо, что остаетесь со мной и до скорой встречи!