Rails / サイトマップの自動生成 sitemap_generator

Shunsuke Sawada

Railsアプリのサイトマップを作るならsitemap_generatorというGemがよく使われますが、Amazon S3にサイトマップファイルを保存する際に少しハマったのでメモしておきます。herokuを使っていると役に立つかと思います。

Gem : kjvarga / sitemap_generator

sitemap_generatorの設定

Githubの通りで問題ないかと。

Gemfile

1
gem 'sitemap_generator'

インストール

1
rake sitemap:install

config/sitemap.rb

ruby
1
2
3
4
5
6
7
8
9
10
11
SitemapGenerator::Sitemap.default_host = "http://your_site.com"
SitemapGenerator::Sitemap.sitemaps_host = "https://BUCKET_NAME.s3.amazonaws.com/"
SitemapGenerator::Sitemap.public_path = 'public/'
SitemapGenerator::Sitemap.sitemaps_path = 'sitemaps/'
SitemapGenerator::Sitemap.adapter = SitemapGenerator::WaveAdapter.new

SitemapGenerator::Sitemap.create do
  posts = Post.where("published=?", true)
  posts.each do |post|
    add post_path(post), :lastmod => post.updated_at
end

  

Carrierwaveの設定

すでにCarrierwaveを使っていて、fogでS3にアップロードしているプロジェクトに
sitemap_generatorを導入する場合の注意です。

config/initializers/carrierwave.rb

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CarrierWave.configure do |config|

  # This is necessary for sitemap_generator
  config.storage = :fog

  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => '',
    :aws_secret_access_key  => '',
    :region                 => ''
  }

  # Bucket name
  config.fog_directory = ''

end

のように config.storage = :fogが必要です。
Carrierwaveだけ使ってるといらないんですけどね。

参考:upload to S3 not working
  
ちなみに、Carriewaveの設定で、開発環境ではローカルに保存して、本番環境ではS3に保存するみたいなこともできます。開発環境のサイトマップをグーグルにお知らせしたいということは無いと思いますので、普通はこうするかな。

uploads/image_uploader.rb (例)
ファイル名はCarriewaveをどう使ってるかで変わってきます。

ruby
1
2
3
4
5
6
7
8
9
  # Amazon S3
  if Rails.env.production?
    storage :fog
  end

  # Local strage
  if Rails.env.test? or Rails.env.development?
    storage :file 
  end

  

サイトマップの作成

rake sitemap:refreshを打つと、サイトマップを作成してくれます。
rake sitemap:refresh:no_ping だと、検索エンジンにお知らせせず、サイトマップだけを更新します。

ブログのように、記事を作る度に、サイトマップを更新したければ、posts#createの中に処理をかけばいいでしょうし、大量の記事が投稿されるサイトなんかだと、cronにしとけばいいと思います。

頻繁に呼ぶなら、ヘルパーにしておくといいかもしれません。

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module SitemapHelper

  def create_sitemap

    SitemapGenerator::Sitemap.default_host = ******
    SitemapGenerator::Sitemap.sitemaps_host = ******
    SitemapGenerator::Sitemap.sitemaps_path = ******
    SitemapGenerator::Sitemap.public_path = 'public/'
    SitemapGenerator::Sitemap.adapter = SitemapGenerator::WaveAdapter.new

    SitemapGenerator::Sitemap.create do
      posts = Post.where("published=?", true)
      posts.each do |post|
        add post_path(post), :lastmod => post.updated_at
      end
    end
  end
end

herokuのschedulerを使うと、定期処理は楽です。
add-onを追加して、下記のコマンドを実行させればOK。hourlyやweeklyはお好みで。

1
$ rake sitemap:refresh

  

Google Webmaster toolに登録

生成されるsitemapは

sitemaps_host + Bucketの名前 + sitemaps_path + サイトマップのファイル名となっているはずです。
なので、これをGoogle Webmaster toolで登録したいのですが、ファイルがあるのがAmazon S3なので、別サイトを登録することに、、、てなるのは嫌なので、routesに書いてリダイレクトさせると良いかと思います。

routes.rb

ruby
1
get 'sitemap', to: redirect('http://s3-ap-northeast-1.amazonaws.com/your_bucket/sitemaps/sitemap.xml.gz')

でwebmaster toolには '/sitemap' で登録できるはず。
  

Robot.txt

検索エンジンにサイトマップを見つけさせるために、robot.txtにURLを書く必要があります。
Railsでは、robot.txtが /public にデフォルトで作成されているので、S3のURLを入れておきましょう。

1
Sitemap: https://BUCKET_NAME.s3.amazonaws.com/sitemaps/sitemap.xml.gz
11
Shunsuke Sawada

おすすめの記事

acts-as-taggable-on タグを表示させる順番を決めたい
Railsを4.2にバージョンアップしたら、Vagrantのローカル開発環境にアクセスできなくなった問題
Railsのバリデーションエラー後にレイアウトが崩れるとき