Создание Sitemap.xml в Rails

Создание Sitemap в Rails довольно простая задача. Всё что вам нужно сделать это:

1) Создать контроллер или использовать уже готовый. Я пошел вторым путём. В этот контроллер нужно добавить действие которое будет отвечать за создание Sitemap.xml страницы.

def sitemap
  headers['Content-Type'] = "application/xml"
  @messages = Message.find :all, :limit => 50000, :order => "published_at DESC"
end

Первая строка устанавливает заголовок Content-Type в “application/xml” это означает для браузера (или поискового сервера) что контент файла находится в формате XML. Sitemap который мы создаём соответствует спецификации под номером 0.9 в которой сказано что контент должен быть именно в этом формате.

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

Ещё один немаловажный момент связанны с этим методом: нужно отключить текущий layout если он у вас установлен.

layout 'main', :except => [:sitemap]

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

Кстати, как вариант, заместо этой строчки можно добавить в метод (в конец метода) следующую строчку такого вида:

render :layout => false

2) Следующим шагом будет создание представления которое называется так же как и наше действие и лежит в каталоге представления ассоциированном с контроллером. Называется он у меня так: sitemap.rxml. Обратите внимание на расширение rxml это означает что в этом файле мы собираемся работать с XML а вспомогательные методы Rails помогут нам в этом.

xml.instruct! :xml, :version=>"1.0"
xml.urlset(:xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9") {
  xml.url {
    xml.loc(url_for :controller => 'blog', :only_path => false)
    lastmod = @messages[0].published_at.strftime("%Y-%m-%d") if !@messages.nil?
    lastmod = lastmod || Time.now.strftime("%Y-%m-%d")
    xml.lastmod(lastmod)
    xml.changefreq("daily")
    xml.priority(1)
  }
  for message in @messages
    xml.url {
      xml.loc(url_for :controller => 'blog', :action => 'message', :id => message.id, :only_path => false)
      xml.lastmod(message.published_at.strftime("%Y-%m-%d"))
      xml.changefreq("weekly")
      xml.priority(0.8)
    }
  end
}

В первой строке мы задаём сигнатуру XML файла. А затем, во второй строке, создаём корневой XML тэг под названием urlset с атрибутом xmlns который указывает на то какую версию Sitemap спецификации мы используем при генерации файла.

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

Тэг xml.loc содержит полный URL путь в странице (чтобы получить полный путь, а не относительный, у метода urlfor_ устанавливаем опцию onlypath_ равной false)

Тэг xml.lastmod содержит дату (время указывать необязательно) последнего изменения страницы. Для главной страницы блога я вычисляю его на основании первой последней записи в созданной блоге.

Тэг xml.changefreq указывает с какой частотон надо проводить сканирование каждой конкретной страницы (учтите что вы всего лишь предлагаете поисковому боту сканировать с такой частотой, а он сам затем решает следовать вашим указаниям или нет). В данном случае я хочу чтобы главная страница сканировалась ежедневно (daily), а страницы с сообщениями раз в неделю (weekly)

Тэг xml.priority указывает в каком порядке бот должен сканировать страницы (допустимы знчения от 0.0 до 1.0) После этих 2-х шагов по адресу http://localhost:3000/<контроллер содержащий действие sitemap>/sitemap вы должны получить контент sitemap файла.

3) Последний завершающий штрих состоит в том что мы заставим Rails отдавать sitemap файл по более короткому URL. Для этого в файл config/routes.rb добавим следующую строку:

map.sitemap "/sitemap.xml", :controller => "<ваш контроллер>", :action => "sitemap"

Теперь обратившись по адресу http://localhost:3000/sitemap.xml вы получите sitemap.xml файл.

На этом создание sitemap.xml файла закончено.

P.S. Есть ещё более правильный способ создания sitemap файла, это использование специальных плагинов, но этот способ я постараюсь рассмотреть позже.

Тэги: rails sitemap
Будь всегда в курсе последних новостей блога подписавшись на новости
в формате RSS. Присоединяйся!
* * *

Комментарии

* * *

Добавить новый комментарий

Доступные BB теги

*

* (не будет опубликован)

(если есть)

  • Multi CAPTCHA Refresh2
  • *

1. Проверьте комментарий перед отправкой
2. Все комментарии проходят модерацию перед публикацией в блоге