2019年7月12日金曜日

ruby (sinatra) で sitemap_generator を使ってみた

概要

sitemap_generator は ruby で sitemap.xml.gz が作成できるライブラリです
アクセスごとに生成するのではなく事前に生成してデプロイするタイプです
今回は普通に XML ファイルを生成する方法と Sinatra などの Web アプリ上に組み込む方法を検討してみました

環境

  • macOS 10.14.5
  • Ruby 2.6.2p47
    • sitemap_generator 6.0.2
    • sinatra 2.0.5

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "sitemap_generator"
  • bundle install --path vendor

普通に使ってみた

  • vim app.rb
require 'sitemap_generator'

SitemapGenerator::Sitemap.default_host = 'http://sample.local'
SitemapGenerator::Sitemap.create do
  add '/about', :priority => 0.8
  add '/apps', :changefreq => 'hourly', :priority => 0.8
  add '/blog', :changefreq => 'daily', :priority => 0.6
end
SitemapGenerator::Sitemap.ping_search_engines

ping_search_engines は主要なクローラ更新の ping を送信することができます

  • bundle exec ruby app.rb

public/sitemap.xml.gz が作成されます
中身を確認してみましょう

  • gzip -dc public/sitemap.xml.gz | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:pagemap="http://www.google.com/schemas/sitemap-pagemap/1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
  <url>
    <loc>http://sample.local</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>http://sample.local/about</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>http://sample.local/apps</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>hourly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>http://sample.local/blog</loc>
    <lastmod>2019-07-02T21:32:40+09:00</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.6</priority>
  </url>
</urlset>

lastmod はデフォルトだと生成した時間になります
changefreq はルートパスは always になります
それ以外は weekly がデフォルトになるようです
priority は指定がない場合 0.5 がデフォルトになります

Sinatra で使ってみた

  • vim Gemfile
gem "sitemap_generator"
gem "sinatra"
  • bundle install --path vendor
  • vim app.rb
require 'sitemap_generator'
require 'sinatra/base'

module Util
  Paths = [
    '/about' => {
      :priority => 0.8
    },
    '/apps' => {
      :changefreq => 'hourly',
      :priority => 0.8
    },
    '/blog' => {
      :changefreq => 'daily',
      :priority => 0.6
    }
  ]

  def self.sitemap
    SitemapGenerator::Sitemap.default_host = 'http://sample.local'
    SitemapGenerator::Sitemap.create do
      Paths.each do |path|
        path.each do |k, v|
          add k, v
        end 
      end
    end
    # SitemapGenerator::Sitemap.ping_search_engines
  end
end

class MyApp < Sinatra::Base
  Util::Paths.each do |path|
    path.keys.each do |p|
      get p do
        p
      end
    end
  end
end

Util.sitemap
  • vim config.ru
require './app.rb'
run MyApp
  • bundle exec ruby app.rb

public/sitemap.xml.gz が作成されます
そして

  • bundle exec rackup config.ru

でアプリが起動します
localhost:9292/about などにアクセスするとレスポンスが返ってきます

ポイントは require 'sinatra/base' すること
require 'sinatra' してしまうと 4567 で WEBrick が起動してしまいます

robots.txt は

ちゃんと .gz を付与しましょう

User-Agent: *
Allow: /
Sitemap: https://sample.local/sitemap.xml.gz

最後に

sitemap_generator を使ってみました
動的にレンダリングする機能はないので sitemap.xml を生成してからサイトにデプロイしましょう
Sinatra アプリなどですでにルーティングのパスを定義している場合はその情報を使って sitemap.xml を生成するようにすれば漏れはなくなると思います

ちゃんと作成できているか確認するには https://www.xml-sitemaps.com/ とかのサイトを使えば sitemap.xml を生成してくれるので比較してみると良いと思います

0 件のコメント:

コメントを投稿