更新日:
【Rails】 sitemap_generatorを使ってサイトマップを作成しよう
sitemap_generatorはサイトマップを自動で作成してくれるgemです。
この記事ではsitemap_generatorというgemを使い、Railsアプリで自動でサイトマップを作成する方法を学びます。
サイトマップとは
サイトマップとは、ウェブサイト上のページ構造を示す一覧表のようなもので、ウェブサイトの全体像を整理し、検索エンジンやユーザーにウェブサイトの内容と構造を理解しやすくするためのものです。
サイトマップを作成することで、検索エンジンがサイトのすべてのページを正確に理解しやすくなるため、SEO(検索エンジン最適化)に役立ちます。小規模なサイトであれば手動で作成できますが、大規模なサイトや頻繁に更新されるサイトではツールなどを使用して自動でサイトマップを作成するのが一般的です。
クロールとは
クロールは、検索エンジンのロボット(クローラー)がウェブサイトのページを見つけて読みに行くことです。これは、新しいページや更新されたページを見つけるための重要な作業です。クローラーはウェブページのリンクをたどりながら、新しいページを見つけて読み込みます。
サイトマップは、クローラーにサイトの構造と重要なページを教えるリストです。これを使うと、クローラーが効率よくサイトを巡回できます。また、robots.txtというファイルで、クローラーに見せたくないページを指定できます。これにより、重要でないページや他人に見せたくないページをクロールから守ることができます。
インデックスとは
インデックスは、クローラーが見つけたデータを検索エンジンのデータベースに保存することです。これにより、検索エンジンはユーザーが検索バーに入力したキーワード(クエリ)に対して、最も関連性の高いページを表示することができます。
インデックスは定期的に更新されます。ページが変更された場合、その変更がインデックスに反映されます。これにより、最新の情報が検索結果に表示されます。
gemをインストールしよう
まずはsitemap_generatorを使う準備をしていきましょう。
Gemfileに下記のコードを追記しましょう。
1
gem 'sitemap_generator'
その後、bundle installコマンドでインストールします。
sitemap_generatorの使い方
この章ではsitemap_generatorの使い方を解説していきます。
必要なファイルを作成しよう
次にサイトマップを設定するためのsitemap.rbというファイルをconfigフォルダに作成します。手動で作成しても良いですし、以下のコマンドを使って自動で作成することもできます。
1
bundle exec rake sitemap:install
ファイルを編集しよう
自動でsitemap.rbファイルを作成すると、以下のように記述されています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Set the host name for URL creation
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.create do
# Put links creation logic here.
#
# The root path '/' and sitemap index file are added automatically for you.
# Links are added to the Sitemap in the order they are specified.
#
# Usage: add(path, options={})
# (default options are used if you don't specify)
#
# Defaults: :priority => 0.5, :changefreq => 'weekly',
# :lastmod => Time.now, :host => default_host
#
# Examples:
#
# Add '/articles'
#
# add articles_path, :priority => 0.7, :changefreq => 'daily'
#
# Add all articles:
#
# Article.find_each do |article|
# add article_path(article), :lastmod => article.updated_at
# end
end
コメントアウトにあるように、ルートパス「/」とサイトマップインデックスファイルは自動的に追加されます。
まずは2行目でサイトマップを作成するサイトのURLを指定します。この値がdefault_hostとして設定されます。
1
2
# Set the host name for URL creation
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
次にサイトマップに追加するURLを以下のように記述していきます。
1
2
3
4
5
6
# Set the host name for URL creation
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.create do
add '追加するURL', priority: 0.5, changefreq: 'daily', lastmod: '2024-01-01T00:00:00+00:00'
end
addの次に追加するパスを指定します。その後には、オプションとして以下の属性を追加できます。省略した場合はデフォルト値が参照されます。
| 属性 | 役割 | デフォルト値 |
|---|---|---|
| priority | 相対的な優先度 | 0.5 |
| changefreq | ページの更新頻度 | weekly |
| lastmod | 最終更新日時 | Time.now |
| host | ホスト名 | default_host |
priority属性
priority属性は、サイトマップで各URLの相対的な重要度を検索エンジンに伝えるために使用されます。これにより、検索エンジンはサイト内のどのページを優先してクロールすべきかを判断します。
1
2
3
SitemapGenerator::Sitemap.create do
add '追加するURL', priority: 値
end
値は0.0から1.0の範囲で指定され、値が高いほどそのページは重要と見なされます。ただし、これはあくまで参考情報であり、検索エンジンは他のアルゴリズムや要因も考慮します。(Googleの検索エンジンはpriority属性を無視します。※参照)
以下が基本的な属性の範囲の目安です。目安なので必ずしも同じ値にする必要はありません。
| 値 | ページの種類 |
|---|---|
| 1.0 | 非常に重要なページ (通常はサイトのトップページや主要なセクションのトップページ) |
| 0.7 | 重要なコンテンツページ (主要なサービスや商品ページなど) |
| 0.5 | 一般的なコンテンツページ (通常のブログ記事や一般的な情報ページ) |
| 0.3 | あまり重要でないページ (サブページや詳細ページなど) |
| 0.0 | 優先度が非常に低いページ (アーカイブページや古いコンテンツなど) |
changefreq属性
changefreq属性は、指定したページがどのくらいの頻度で変更されるかを検索エンジンに伝えます。これにより、検索エンジンはそのページをどのくらいの頻度でクロールすべきかを判断します。
1
2
3
SitemapGenerator::Sitemap.create do
add '追加するURL', changefreq: '値'
end
以下のような値を設定することができます。
| 値 | 説明 |
|---|---|
| always | 常に更新されるページ |
| hourly | 毎時間更新されるページ |
| daily | 毎日更新されるページ |
| weekly | 毎週更新されるページ |
| monthly | 毎月更新されるページ |
| yearly | 毎年更新されるページ |
| never | 更新されないページ |
例えば、ニュースサイトのトップページや頻繁に更新されるブログのホームページには hourlyやdailyが適しています。一方、会社の連絡先ページや利用規約ページなどあまり更新されないページは yearlyやneverに設定することが多いです。
ただ指定しても必ず検索エンジンがこの頻度でクロールするとは限りません。そのため、省略しても特に問題はありません。(Googleの検索エンジンはpriority同様、changefreq属性を無視します。)
lastmod属性
lastmod属性は、サイトマップ内で各URLが最後に変更された日時を検索エンジンに通知するために使用されます。これにより、検索エンジンはページの最新の状態を把握し、必要に応じて再クロールを行います。これにより、検索エンジンはページの更新状況を把握し、クロールとインデックスの更新を効率的に行うことができます。
1
2
3
SitemapGenerator::Sitemap.create do
add '追加するパス', lastmod: '値'
end
値の記述フォーマットはISO 8601フォーマットの日付文字列で記述されます。典型的なフォーマットは以下の通りです。
1
2
YYYY-MM-DD
YYYY-MM-DDThh:mm:ssTZD(例: 2024-01-01T00:00:00+00:00)
Googleは、lastmodの値が正確で一貫していると確認できた場合(例えば、ページの最終更新日時と一致しているかどうかを比較するなどして)、この値を利用します。そのため、lastmodの値を正確に保つことがとても重要です。
指定できるオプションの中で一番重要な属性と言えるでしょう。
host属性
host属性は、サイトマップを生成する際に、各URLのホスト名を指定するために使用されます。これにより、最初にデフォルトのホストとして定義したものとは異なるホスト名を持つページを同じサイトマップ内に含めることができます。
1
2
3
4
5
6
7
# デフォルトのホスト名を指定
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.create do
# host属性を使い、デフォルトのホスト名以外を指定
add '/login', host: 'https://secure.example.com'
end
この例の場合、以下のようなサイトマップが作成されます。
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://secure.example.com/login</loc>
<lastmod>2024-01-01T00:00:00+09:00</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</changefreq>
</url>
</urlset>
パスを指定しよう
サイトマップに追加するURLは以下のように指定できます。
1
2
3
4
5
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.create do
add '/articles', changefreq: 'monthly', priority: 0.8
end
すると以下のようにデフォルトで指定したホスト名の後にパスが追加されたURLを作成することができます。
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.example.com/articles</loc>
<lastmod>2024-01-01T00:00:00+09:00</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</changefreq>
</url>
</urlset>
また、パスの指定には_pathヘルパーを使って指定することもできます。
1
2
3
SitemapGenerator::Sitemap.create do
add articles_path, changefreq: 'monthly', priority: 0.8
end
このようにして手動でサイトマップに追加するパスを指定できますが、新たに作成されたページをその都度、追加するのは面倒です。その際は下記のように記述することで自動でサイトマップに追加することもできます。
1
2
3
4
5
SitemapGenerator::Sitemap.create do
Article.find_each do |article|
add article_path(article), lastmod: article.updated_at, priority: 0.7
end
end
この例では、articlesテーブルのすべてのレコードをfind_eachメソッドを使って順番に各レコードを取り出しています。その後、_pathヘルパーを使ってパスを作成し、updated_atで各レコードの更新日時を取得して、lastmod属性の値としてセットしています。
サイトマップを作成しよう
パスとオプションの設定が完了したら次のコマンドを実行し、サイトマップを作成します。
1
bundle exec rake sitemap:refresh
このコマンドでサイトマップを作成すると、作成時に新しいサイトマップが利用可能になったことをGoogleに通知します。
コマンドを実行後、以下のように出力されれば作成に成功しています。
1
2
3
In '/Users/username/appname/public/':
+ sitemap.xml.gz. 2 links / 353 Bytes
Sitemap stats: 2 links / 1 sitemaps / 0m00s
また、検索エンジンに通知せずに新しいサイトマップを作成するには以下のコマンドを使います。
1
2
3
bundle exec rake sitemap:refresh:no_ping
# もしくは
bundle exec rake sitemap:create
成功するとpublicフォルダにsitemap.xml.gzというファイルが作成されます。このファイルはGNU Zip(gzip)形式で圧縮されされているため、中身を確認するには以下のコマンドで展開する必要があります。
1
gzip -d public/sitemap.xml.gz
展開したファイルは改行がされておらず確認しづらいので、以下のコマンドを使ってフォーマットすることで読みやすくなります。
1
xmllint --format public/sitemap.xml -o public/formatted_sitemap.xml
このコマンドを実行するとpublicフォルダにformatted_sitemap.xmlファイルが作成されます。
作成したサイトマップを消去したい時は以下のコマンドで削除することができます。
1
bundle exec rake sitemap:clean
作成後、自動でアップできるようにしよう
これでサイトマップを自動で作成できるようになりました。
作成された際に自動でサイトマップを本番環境へ送信するにはアダプタを使用します。例えばAWSのS3にアップする場合は以下のように記述します。
1
2
3
4
5
6
7
8
9
10
11
12
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.sitemaps_host = "サイトマップを設置するホスト名"
SitemapGenerator::Sitemap.public_path = "ローカルでの生成場所"
SitemapGenerator::Sitemap.sitemaps_path = "生成先のディレクトリ名"
SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new(
fog_provider: 'AWS',
aws_access_key_id: "AWSアクセスキーID",
aws_secret_access_key: "AWSシークレットアクセスキー",
fog_directory: "バケット名",
fog_region: "AWSのリージョン")
# 〜略
例えば以下のように記述します。
1
2
3
4
5
6
7
8
9
10
11
12
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.sitemaps_host = "https://s3-ap-northeast-1.amazonaws.com/#{ENV['S3_BUCKET']}/"
SitemapGenerator::Sitemap.public_path = "tmp/"
SitemapGenerator::Sitemap.sitemaps_path = "sitemaps/"
SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new(
fog_provider: 'AWS',
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
fog_directory: ENV['S3_BUCKET'],
fog_region: "ap-northeast-1")
# 〜略
AWSアクセスキーIDの情報などは人には知られてはいけない情報なので、環境変数として定義しましょう。環境変数はdotenv-railsというgemを使うと管理が簡単です。
最後に検索エンジンがサイトマップを見つけやすくするために、publicディレクトリにあるrobots.txtファイルにサイトマップのURLを追加しておきましょう。
1
2
# サイトマップのURLを追加
Sitemap: https://バケット名.s3.ap-northeast-1.amazonaws.com/sitemaps/sitemap.xml.gz
自動で定期的に作成できるようにしよう
この章ではサイトマップを最新の情報に保つため、定期的にサイトマップを自動作成する方法を解説をします。
必要なgemをインストールしよう
定期的に特定のコマンドを実行するには、「cronジョブ」と呼ばれるUNIX系のオペレーティングシステムで時間ベースのジョブスケジューリング機能を使用します。そのために、今回はwheneverというgemを使います。
Gemfileに下記のコードを追記しましょう。
1
gem 'whenever', require: false
その後、bundle installコマンドでインストールします。
wheneverの設定をしよう
wheneverを使ってcronジョブを設定するには、以下のコマンドを実行して config/schedule.rbファイルを生成します。
1
bundle exec wheneverize .
実行後、以下のように出力されていれば成功し、configフォルダにschedule.rbファイルが作成されます。
1
2
[add] writing `./config/schedule.rb'
[done] wheneverized!
生成された schedule.rbファイルを編集して、サイトマップを定期的に生成するジョブを追加します。
1
2
3
4
5
6
7
8
9
10
# 環境を指定
set :environment, "production"
# job_type をカスタマイズして bundle exec を使用
job_type :rake, "cd :path && bundle exec rake :task --silent :output"
# 例:毎日深夜にサイトマップを生成するジョブを追加
every 1.day, at: '12:00 am' do
rake "sitemap:refresh"
end
この設定では、毎日深夜にサイトマップを生成するジョブが実行されます。
設定が完了したら、以下のコマンドを実行してcronジョブを更新します。
1
bundle exec whenever --update-crontab
以下のように出力されれば更新は成功しています。
1
[write] crontab file updated
最後に以下のコマンドを実行して、cronジョブが正しく設定されているかを確認します。
1
crontab -l
以下のように表示されれば正しく設定されています。
1
2
3
4
# Begin Whenever generated tasks for: /Users/username/dev/appname/config/schedule.rb at: 2024-01-01 01:01:00 +0900
0 0 * * * /bin/bash -l -c 'cd /Users/username/dev/appname && bundle exec rake sitemap:refresh --silent'
# End Whenever generated tasks for: /Users/username/dev/appname/config/schedule.rb at: 2024-01-01 01:01:00 +0900
これで完了です。
この記事のまとめ
sitemap_generatorはサイトマップを自動で作成してくれるgemです。- サイトマップを作成することでSEOに役立ちます。
- サイトマップを作っていない方はこのgemを使い、アプリに取り入れましょう。