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:
- Check file robots settings (vd: http://mywebsite.com/robot.txt).
- Gửi request đến trang chủ (http://mywebsite.com).
- Check HTTP response header X-Robots-Tag.
- Cache webpage
- Đánh index cho webpage (dựa trên keywords đọc được từ nội dung trang web).
- 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