12/08/2018, 15:14

Block search engines robots

I. Mở đầu Xin chào các bác. Khi chúng ta xây dựng website thì việc làm SEO rất quan trọng, nó giúp chúng ta tăng thứ hạng tìm kiếm trên kết quả của các search engines. Về mặt lý thuyết, trang web của chúng ta xây dựng càng thân thiện với các search engines càng tốt. Tuy nhiên trong 1 số ...

I. Mở đầu

Xin chào các bác.

Khi chúng ta xây dựng website thì việc làm SEO rất quan trọng, nó giúp chúng ta tăng thứ hạng tìm kiếm trên kết quả của các search engines.

Về mặt lý thuyết, trang web của chúng ta xây dựng càng thân thiện với các search engines càng tốt.

Tuy nhiên trong 1 số trường hợp, chúng ta sẽ không muốn các con robot (aka crawler, spider) tìm thấy content của mình như:

  • Hệ thống đang ở Staging environment.
  • Đang tiến hành chuyển dữ liệu từ hệ thống chính sang vị trí mới.
  • Đang xây dựng các tính năng mới.

Trong những trường hợp trên, có 1 số giải pháp để ngăn chặn các con bot của search engines như sau:

  • Thêm Authenticate
  • Tạo file robot.txt
  • X-Robots-Tag

Các bước thực hiện của search engines:

Để ẩn nội dung website của chúng ta một cách chính xác, ta cần biết search engines sẽ làm gì để thu thập dữ liệu:

  1. Check file robots settings (vd: http://mywebsite.com/robot.txt).
  2. Gửi request đến trang chủ (http://mywebsite.com).
  3. Check HTTP response header X-Robots-Tag.
  4. Cache webpage
  5. Đánh index cho webpage (dựa trên keywords đọc được từ nội dung trang web).
  6. Truy cập các đường link chuyển tiếp trên trang web (follow links) và thực hiện lại các bước trên.

Các bước 1,2,3,6 được gọi là crawling, còn 4 và 5 được gọi là indexing

II. Các phương pháp block:

1. Authenticate:

Đây là phương pháp đơn giản và triệt để nhất, nếu bạn muốn ẩn nội dung trang khỏi các crawler - HTTP Basic Authenticate

class ApplicationController < ActionController::Base
  if ENV["DISALLOW_ALL_WEB_CRAWLERS"].present?
    http_basic_authenticate_with(
      name: ENV.fetch("BASIC_AUTH_USERNAME"),
      password: ENV.fetch("BASIC_AUTH_PASSWORD"),
    )
  end
end

Khi truy cập vào website, nó yêu cầu phải nhập username và password, đơn giản vậy thôi.

Đây thường là tất cả những gì chúng ta cần khi đang ở môi trường Staging.

Các phương pháp giới thiệu tiếp theo đều có những hạn chế của nó, nhưng nó sẽ phù hợp đối với nhu cầu của mình trong từng trường hợp cụ thể.

2. robots.txt (crawling)

robots exclusion standard là một chuẩn (không chính thức), giúp các con crawlers quyết định hành động của mình.

Đầu tiên khi vào truy cập vào website, các robot sẽ tìm đến file /robot.txt trước khi tiến hành crawling.

Tiêu chuẩn đó được áp vào các con robot giả dụ như GoogleBot.

Tuy nhiên, nếu con robot không áp dụng nó cũng chả sao cả (yaoming).

Vì vậy, đây không phải phương pháp bạn cần nếu như muốn ẩn nội dung đi hoàn toàn trước các tác nhân bên ngoài.

Quay trở lại file robot.txt, nội dung bên trong sẽ là:

User-agent: *
Disallow: /

Đoạn code trên có nghĩa là sẽ block toàn bộ nội dung (/) từ tất các các crawlers (User-agent s).

Bạn có thể tham khảo thêm list các crawler của Google tương ứng với user-agent tại đây

Globbing và Regex không được support trong file này. Cú pháp trong nó các bạn tham khảo ở đây

Nếu bạn muốn test, hãy add thêm gem Climate Controller để quản lý environment variables trong tests:

gem "climate_control"

Viết file spec spec/requests/robots_txt_spec.rb:

require "rails_helper"

describe "robots.txt" do
  context "when not blocking all web crawlers" do
    it "allows all crawlers" do
      get "/robots.txt"

      expect(response.code).to eq "404"
      expect(response.headers["X-Robots-Tag"]).to be_nil
    end
  end

  context "when blocking all web crawlers" do
    it "blocks all crawlers" do
      ClimateControl.modify "DISALLOW_ALL_WEB_CRAWLERS" => "true" do
        get "/robots.txt"
      end

      expect(response).to render_template "disallow_all"
      expect(response.headers["X-Robots-Tag"]).to eq "none"
    end
  end
end

Nếu bạn muốn toàn bộ nội dung của mình được search engines crawl, thì Google recommend là bỏ mẹ cái file robot.txt đi :v Google recommends no robots.txt

Trong file config/routes.rb:

get "/robots.txt" => "robots_txts#show"

Thêm vào app/controllers/robots_txts_controller.rb

class RobotsTxtsController < ApplicationController
  def show
    if disallow_all_crawlers?
      render "disallow_all", layout: false, content_type: "text/plain"
    else
      render nothing: true, status: 404
    end
  end

  private

  def disallow_all_crawlers?
    ENV["DISALLOW_ALL_WEB_CRAWLERS"].present?
  end
end

Nếu web của chúng ta có sử dụng gem để authenticate như Clearance hay Devise, nhớ skip callback trong controller

class ApplicationController < ActionController::Base
  before_action :require_login
end

class RobotsTxtsController < ApplicationController
  skip_before_action :require_login
end

Xóa file robot.txt mặc định của Rails, và tạo đưa nó vào thư mục mà mình mong muốn.

VD:

rm public/robots.txt
mkdir app/views/robots_txts

Ở view app/views/robots_txts/disallow_all.erb

User-agent: *
Disallow: /

3. X-Robots-Tag (indexing)

Việc các search engines có thể đánh index cho nội dung trang web chúng ta mà không cần crawling là hoàn toàn có thể. Vì vậy, việc block crawling bằng file robot.txt không thể ngăn chặn được việc này.

Add thêm X-Robots-Tag vào header của response trả về có thể ngăn chặn được điều đó.

Có thể các bạn đã từng nhìn thấy thẻ meta có nội dung như sau:

<meta name="robots" content="noindex,nofollow">

X-Robots-Tag header có tác dụng cho toàn bộ nội dung dữ liệu thuộc các kiểu khác nhau trên web của chúng ta (ex: image, scripts, styles), không chỉ riêng cho file HTML.

Để block crawler, ta cần có trả về header là:

X-Robots-Tag: none

none nó tương đương với noindex, nofollow, thông báo cho robots biết rằng không được đánh index, hay truy cập follow links, hoặc cache webpage lại.

Để áp dụng, ta viết như sau:

Thêm file lib/rack_x_robots_tag.rb:

module Rack
  class XRobotsTag
    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, response = @app.call(env)

      if ENV["DISALLOW_ALL_WEB_CRAWLERS"].present?
        headers["X-Robots-Tag"] = "none"
      end

      [status, headers, response]
    end
  end
end

Ở file config/application.rb thì thêm:

require_relative "../lib/rack_x_robots_tag"

module YourAppName
  class Application < Rails::Application
    # ...
    config.middleware.use Rack::XRobotsTag
  end
end

Nguồn tham khảo:

  • https://robots.thoughtbot.com/block-web-crawlers-with-rails
0