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

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

Gem : kjvarga / sitemap_generator

sitemap_generatorの設定

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

Gemfile

gem 'sitemap_generator'

インストール

rake sitemap:install

config/sitemap.rb

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


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をどう使ってるかで変わってきます。

  # 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にしとけばいいと思います。

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


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はお好みで。

$ rake sitemap:refresh

  

Google Webmaster toolに登録

生成されるsitemapは

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

routes.rb

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を入れておきましょう。

Sitemap: https://BUCKET_NAME.s3.amazonaws.com/sitemaps/sitemap.xml.gz

何かありましたらコメントをどうぞ

comments powered by Disqus

人気の記事

950 Points チリ出身のギタリストが弾くドラゴンボールZがむちゃくちゃかっこいい…
774 Points Wordpress + Heroku + PostgreSQL + Amazon S3 = ¥0 / 無料でサイト運営
700 Points Rubyのチートシート 変数 / クラス / モジュール
524 Points Rubyのチートシート / アクティブサポート
451 Points 紙のデザイナーがウェブ開発できるようになるまでに必要なこと
435 Points Rails / Google Analyticsのデータを使って分析や管理画面のためのグラフをつくる
323 Points RailsとHerokuでノーティフィケーションをプッシュする / PusherとTurbolinksの兼ね合い
222 Points Rails / RSpec テスト書いたことない メンドクサイ(n´Д`)という時のチートシート
193 Points Rails / Ajaxを使って画面遷移しない一時保存機能をつける
193 Points Protractorでスクレイピングしてみた