Block search engines robots
Bài đăng này đã không được cập nhật trong 7 năm
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:
All rights reserved