Tạo sitemap cho website rails và upload lên s3 - cloudfront

1. Mở đầu

Sitemap là gì? Đúng như tên của nó, Sitemap (sơ đồ của một website) là tập tin văn bản có chứa tất cả các URL (đường dẫn) của một website. Nó cũng có thể chứa các siêu dữ liệu về mỗi URL, thông báo cho bạn khi nó mới được cập nhật. Toàn bộ công việc của nó là hướng dẫn cho các công cụ tìm kiếm thu thập thông tin của website một cách hiệu quả và cập nhật những thay đổi trên website của bạn, như là thêm một trang mới hoặc thay đổi trang web hiện tại.

Có hai loại sitemap một loại là HTML sitemap và XML Sitemap.

  • HTML sitemap được sử dụng chủ yếu cho người đọc biết được sơ đồ của trang web và họ có thể dễ dàng tìm kiếm thông tin hơn.
  • Loại thứ hai là XML Sitemap được tạo ra để dành riêng cho các công cụ tìm kiếm. Nó báo cho các công cụ tìm kiếm về cấu trúc của trang web, tần suất cập nhật nội dung của trang và trang nào được ưu tiên hơn trong kết quả tìm kiếm.

Bạn có thể xem ví dụ ngay chính website của chúng ta là: HTML sitemap và XML Sitemap

Tác dụng của sitemap Một site map tốt nên dẫn tới được mọi vị trí trên website. Nên đặt đường liên kết tới sơ đồ website trên trang chính hoặc trang đầu của trang web để người dùng và con spider của Gooogle có thể tiếp cận dễ dàng.

Tác dụng của sơ đồ thì chắc chắn là để dẫn hướng chỉ đường rồi.

Bên cạnh đó, Sitemap có thể giúp Google biết được những thông tin khác về trang web của bạn như là:

  • Nội dung của bạn được cập nhật thường xuyên hay không.
  • Ngày chỉnh sửa nội dung cuối cùng của trang.
  • Bạn có thể thiết lập tầm quan trọng của từng trang khác nhau.

Tầm quan trọng của sitemap Website của chúng ta cần có sitemap vì như chúng ta đã tìm hiểu ở phần sitemap là gì thì nó có chức năng là sơ đồ web và rất cần thiết cho trang web của bạn để đạt được một vị trí cao trong các hệ thống tìm kiếm, bởi vì các hệ thống tìm kiếm đánh giá rất cao cho các trang web có một sơ đồ điều hướng truy cập website. Rất hữu hiệu cho các bot của các SE lùng sục trong site của bạn để lập chỉ mục (index), có lợi cho chiến lược SEO.

Như vậy, điều chúng ta cần làm là tạo 1 file sitemap.xml và lưu trữ ở đâu đó, báo cho search engines biết file nằm ở đâu.

Tại sao chúng ta nên đưa lên cloud-front.? AMW S3 amazon web service s3 là dịch vụ lưu trữ của AWS. Còn cloudfront là gì Amazon Cloudfront là mạng CDN phân phối nội dung tĩnh và streaming toàn cầu của Amazon. Khi bạn sử dụng CDN sẽ giúp cho khách truy cập nhanh vào dữ liệu máy chủ web gần họ nhất thay vì phải truy cập vào trung tâm dữ liệu của nhà cung cấp hosting bạn đang dùng. Như vậy là nếu website của bạn được cài đặt phân tán (có nhiều webserver vật lý) thì các file assets nên được lưu ở trên S3 và cloudfront để người dùng download assets về nhanh hơn.

2. Cài đặt

gem install sitemap_generator

và tất nhiên là bundle install

3. Cách sử dụng

Phần quan trọng nhất là bạn cần config làm sao để gem sitemap_generator sinh ra file sitemap đúng ý đồ của mình.

File config/sitemap.rb #{ENV["HOST_URL"] = https://yoursite.com

SitemapGenerator::Sitemap.default_host = "#{ENV['HOST_URL']}"
SitemapGenerator::Sitemap.create_index = true
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_NAME"], fog_region: ENV["AWS_REGION"])
SitemapGenerator::Sitemap.sitemaps_host = Rails.env.production? ? Settings.cloudfront_url : "https://s3-#{ENV['AWS_REGION']}.amazonaws.com/#{ENV['S3_BUCKET_NAME']}/"
SitemapGenerator::Sitemap.sitemaps_path = "sitemaps/"
SitemapGenerator::Sitemap.create do
  add questions_path, priority: 0.9, changefreq: "daily"
  add contracts_path, priority: 0.9, changefreq: "daily"
  add search_path, priority: 0.9, changefreq: "hourly"

  big_categories = BigCategory.all

  big_categories.each do |big_category|
    add big_category_path(big_category), priority: 0.9, changefreq: "daily"
  end

  SmallCategory.find_each do |small_category|
    big_category = small_category.big_category
    add small_category_path(big_category, small_category), priority: 0.8, changefreq: "daily"
  end
end

Capfile thêm dòng

require "capistrano/sitemap_generator"

Tạo controller để sitemap có link dạng https://yoursite.com/sitemap.xml.gz , nằm dưới domain của website của bạn.

class SitemapsController < ApplicationController
  def new
    redirect_to "#{sitemap_host}sitemaps/sitemap.xml.gz"
  end

  private
  def sitemap_host
    Rails.env.production? ? Settings.cloudfront_url : "https://s3-#{ENV['AWS_REGION']}.amazonaws.com/#{ENV['S3_BUCKET_NAME']}/"
  end
end

Tạo 1 rake để dễ run trên staging và production. Sau khi tạo sitemap thì ping search engines để BOT vào cập nhật.

lib/tasks/update_sitemap.rake

namespace :update_sitemap do
  task refresh: :environment do
    puts "Start update sitemap"
    %x[DEPLOY_REF=master bundle exec cap #{Rails.env} sitemap:refresh]
    SitemapGenerator::Sitemap.ping_search_engines("#{ENV["HOST_URL"]}/sitemap.xml.gz")
    puts "Finished update sitemap"
  end
end

Sửa robots.txt để BOT biết link sitemap website mình nằm ở đâu. (Bạn nên lấy link cloud-front để việc tải về file xml nhanh hơn. Vì cloud-front là host assets phân tán. Nhưng nhược điểm là khi file được upload lên s3, khoảng 1h-24h trên cloud-front mới được cập nhật.)

public/robots.txt

# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
# User-agent: *
# Disallow: /
Sitemap: https://yoursite.com/sitemap.xml.gz

Lập lịch để cập nhật lại file sitemap. Giả sử ở đây là mỗi tuần sẽ cập nhật sitemap và upload lên amazon web service s3 1 lần. config/schedule.rb

 every :sunday, at: "3:00 am" do
   rake "update_sitemap:refresh"
 end

Thành quả là chúng ta sẽ thu được file xml dạng:

<urlset xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>https://yoursite.com</loc>
<lastmod>2017-03-27T18:13:57+09:00</lastmod>
<changefreq>always</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://yoursite.com/qa</loc>
<lastmod>2017-03-27T18:13:57+09:00</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
...

Có vẻ như config hơi nhiều nhưng thực ra việc bạn cần làm là chạy rake khi cần hoặc đợi chủ nhật cho crontab chạy hộ.

bundle exec rake update_sitemap:refresh

4. Tổng kết

Như vậy, với việc sử dụng gem sitemap_generator chúng ta đã tạo ra sitemap cho website, hi vọng các con BOT search engines sẽ hiểu rõ hơn về website của mình và đánh giá cao sản phẩm của chúng ta 😃) Dưới đây là link tham khảo https://github.com/kjvarga/sitemap_generator