Rails / サイトマップの自動生成 sitemap_generator
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