Xử lý vấn đề trùng lặp nội dung khi sử dụng CDN cho Website

CDN là một trong các biện pháp giúp tăng tốc độ website rất hiệu quả, thông qua việc đưa các nội dung tĩnh phân tán khắp các máy chủ trên toàn cầu, và người dùng sẽ lấy được dữ liệu gần họ nhất, qua đó cải thiện thời gian truyền tải dữ liệu (giảm độ trễ).

Và như hệ quả của việc người duyệt web sẽ hài lòng hơn thì SEO của bạn cũng tốt hơn. Nhưng bản thân CDN lại tạo ra các nội dung trùng lặp (duplicate content) và nếu chúng ta không điều chỉnh, nó lại ảnh hưởng tiêu cực đến SEO. Và vấn đề này thì không nhỏ tí nào.

Tại sao có các nội dung trùng lặp?

CDN sao chép các nội dung tĩnh của bạn, trong đó có html, ảnh, css, js,… và các tài liệu văn bản khác nếu website của bạn có như pdf, doc, ppt,… cùng các dữ liệu media như audio, video, vân vân.

Dù bạn có thiết lập tên miền tùy chỉnh cho địa chỉ CDN hay không (tên miền CDN dạng subdomain, ví dụ như cdn.chimcat.net) thì riêng việc sử dụng CDN đã tạo ra dữ liệu giống hệt trang web của bạn rồi, điều này sẽ làm cho Google lúng túng.

Google cuối cùng sẽ vẫn đưa một trong hai nội dung vào kết quả tìm kiếm, nhưng vấn đề là chúng sẽ bị xem là riêng biệt và có thể liên kết được đưa lên không như mong muốn của bạn.

Chẳng hạn Google sẽ xếp hạng ảnh, hay tài liệu của liên kết mà “bạn không muốn” ở vị trí tốt hơn ảnh hay tài liệu mà bạn thực sự muốn Google đưa vào kết quả (hoặc thậm chí thường là loại bỏ luôn liên kết mà nó cho là trùng lặp).

Ngoài ra nếu có các backlink trỏ về hai nội dung sao chép khác nhau ấy, các backlink đó bị xem là tách biệt và bạn bị thiệt thòi vì nếu nó được cộng dồn, hiệu quả SEO sẽ tốt hơn.

Hướng dẫn của Google trong việc xử lý vấn đề này

Google có công bố tải liệu hướng dẫn chi tiết về vấn đề xử lý nội dung trùng lặp ở đây: https://support.google.com/webmasters/answer/139066

Tuy nó khá kỹ thuật và không bàn chi tiết về tình huống sử dụng CDN, bạn vẫn nên đọc, vì các hướng dẫn chính thức từ Google là cơ sở để chúng ta thực hiện các điều chỉnh.

Chặn bọ tìm kiếm bằng robots.txt không phải là giải pháp đúng

Một số dịch vụ CDN để mặc định chặn bọ tìm kiếm quét nội dung CDN bằng file robots.txt kiểu thế này:

User-agent: *
Disallow: /

Về mặt cảm giác lựa chọn này có vẻ sẽ giúp bạn chống lại nội dung trùng lặp, bởi vì bạn sẽ nghĩ là nếu bọ tìm kiếm không quét được nội dung CDN thì làm gì có chỉ mục để mà trùng lặp với nội dung gốc của bạn nữa.

Nhưng đây lại là sai lầm nghiêm trọng nhất.

Đặc điểm của robots.txt là nó chỉ chặn lập chỉ mục hoàn toàn với ảnh, còn các nội dung như html nó sẽ vẫn lập chỉ mục nếu có liên kết nào trỏ đến.

Hơn nữa khi bạn làm như vậy các ảnh trên trang sẽ không được lập chỉ mục nữa, tại sao?

Vì khi dùng CDN, website của bạn sẽ chuyển sang sử dụng tài nguyên CDN. Nếu bạn dùng robots.txt để chặn bọ quét ảnh, thì khi bọ tìm kiếm nhìn thấy trang html của bạn, nó sẽ chỉ quét được văn bản text, còn ảnh thì không được lập chỉ mục, nó không có thông tin gì về ảnh này. Đấy là còn chưa kể cả CSS lẫn JS cũng chặn bọ tìm kiếm nốt, mà đây đều là những tài nguyên quan trọng cần bọ tìm kiếm quan sát.

Như vậy dùng robots.txt để chặn bọ tìm kiếm quét tài nguyên CDN gây ra hậu quả kép nghiêm trọng dễ thấy:

  • Nội dung html trùng lặp vẫn có khả năng bị lập chỉ mục như thường
  • Ảnh CDN cùng các tài nguyên khác cần được bọ tìm kiếm quan sát thì lại bị cấm

Vậy là chúng ta không thể dùng robots.txt để chống trùng lặp nội dung trong CDN được, ngược lại với cảm giác, thay vì chặn bọ tìm kiếm, chúng ta phải cho phép chúng quét nội dung trùng lặp.

Các dịch vụ CDN hiện đều cho phép bạn tùy chỉnh thiết lập của robots.txt, tuy nhiên mặc định của từng dịch vụ lại khác nhau, chẳng hạn CDNSun để mặc định là chặn bọ tìm kiếm, trong khi KeyCDN để mặc định là cho phép bọ tìm kiếm lục nội dung.

Để kiểm tra file robots.txt của tên miền CDN, bạn truy cập vào đường link: ten-mien-cdn-cua-ban.com/robots.txt

Ví dụ như của tôi nằm ở đây: https://chimcat.r.worldssl.net/robots.txt

Thông thường điều chỉnh có sẵn của các dịch vụ CDN là đủ, nếu bạn muốn điều chỉnh sâu hơn cần học cách làm cẩn thận, vì nhầm nhọt ở đây sẽ rất ảnh hưởng. Google có tài liệu rất ổn về robots.txt để bạn tham khảo: https://support.google.com/webmasters/answer/6062608?hl=vi

Nghe có vẻ rối rắm, vậy chúng ta nên làm gì tiếp theo?

Dựa trên hướng dẫn của Google về xử lý vấn đề trùng lặp nội dung thì với CDN chúng ta nên dùng thẻ canonical để cho Google biết đâu là nội dung gốc. Và với WordPress, bạn chỉ cần dùng Yoast SEO là nó mặc định chèn canonical vào nội dung gốc html để bất kỳ bản sao nào cũng sẽ trỏ đến link gốc.

Như hình dưới đây cho thấy, một trang html CDN có thẻ canonical trỏ về link gốc:

dùng thẻ canonical trỏ về link gốc

Các nội dung văn bản khác như pdf, doc cũng áp dụng được canonical và sẽ giúp Google biết được đâu là nội dung gốc, việc bổ sung canonical cho các nội dung này cần thêm một đoạn mã vào .htaccess, tôi sẽ nói rõ hơn ở bên dưới.

Thế còn ảnh?

Trước đây Google nói rằng thẻ canonical không áp dụng cho ảnh, hiện thì họ nói có phần mù mờ hơn là chỉ áp dụng cho tìm kiếm web. Tuy vậy theo như tôi quan sát thấy thì có vẻ như để phòng xa, nhiều người quản trị web vẫn chèn canonical cho ảnh, dù có thể là Google không sử dụng.

Đoạn mã để bổ sung canonical cho các tài liệu khác html

Như đã nói ở phần trên thì nếu bạn sử dụng WordPress việc thêm canonical cho html trở thành tự động, chỉ cần bạn dùng Yoast SEO (cũng là plugin vô cùng phổ biến).

Còn với các nội dung khác bạn có thể thêm đoạn mã dưới đây vào .htaccess (tuy nhiên bạn cần tìm hiểu trước cách chỉnh sửa .htaccess ở đây):

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf|webp|html)(\.gz)?(\?.*)?$">
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* - [E=CANONICAL:http://%{HTTP_HOST}%{REQUEST_URI},NE]
RewriteCond %{HTTPS} =on
RewriteRule .* - [E=CANONICAL:https://%{HTTP_HOST}%{REQUEST_URI},NE]
</IfModule>
<IfModule mod_headers.c>
Header set Link "<%{CANONICAL}e>; rel=\"canonical\""
</IfModule>
</FilesMatch>

Sau khi lưu file .htaccess, bạn cần vào dịch vụ CDN để làm mới nội dung (purge), khi ấy CDN sẽ nhập lại nội dung của bạn đã bao gồm thông tin canonical.

Hiện thì nhiều dịch vụ CDN cho phép bạn bật tính năng này ngay từ giao diện quản trị CDN của nhà cung cấp, nếu vậy thì bạn sẽ không cần đoạn mã trên nữa. Mình biết có KeyCDN và Stackpath cho phép bạn làm điều này rất dễ dàng. Còn CDNSun thì không, bạn sẽ phải bổ sung đoạn mã trên vào.

Canonical của KeyCDN
KeyCDN cho phép bật Canonical thông qua thao tác chọn lựa

Tóm gọn lại thiết lập để tránh trùng lặp nội dung cho CDN ở thời điểm hiện tại là:

  • Cho bọ tìm kiếm lục nội dung CDN chứ không phải chặn nó
  • Dùng thẻ canonical để cho nó biết đâu là nội dung gốc (html dùng link canonical, các tài nguyên khác dùng header canonical)

Cách kiểm tra xem tài liệu đã có thẻ canonical gắn vào hay chưa?

Bạn nên kiểm tra cả tài liệu gốc lẫn tài liệu sao chép (CDN) để xem thẻ canonical có được gắn vào hay không.

Bạn sử dụng công cụ này để kiểm tra: https://www.seoreviewtools.com/canonical-url-location-checker/

Ví dụ tôi kiểm tra một bản pdf trên trang ducanhplus.com (nay đã đổi thành kiencang.net), nếu bạn thấy bên tay phải có nội dung chỉ đến link gốc là ok:

canonical link

Ví dụ khác về một ảnh CDN trên trang Chim Cắt:

kiểm tra thẻ canonical của CDN

Cuối cùng thì bạn nên bổ sung tên miền của CDN vào công cụ quản trị web của Google để xác thực đây là nội dung bạn sở hữu.

Vấn đề với việc Google không lập chỉ mục ảnh sau khi sử dụng CDN

Hãy xem bức ảnh sau được lấy từ khu vực quản trị web (thu thập dữ liệu > sơ đồ trang web) của trang ducanhplus để thấy hiện tượng trên:

thống kê chỉ mục hình ảnh

Bạn có thể thấy trang tôi từ hơn 5000 ảnh được lập chỉ mục, giờ chỉ còn hơn 100 ảnh, lý do của chuyện này là file xml được đẩy lên công cụ quản trị web của Google vẫn sử dụng đường link ảnh gốc, trong khi đó bài viết trên trang lại là ảnh ở CDN, do có mâu thuẫn này, các ảnh gốc bị loại dần khỏi chỉ mục.

Với giả định bạn dùng sitemap do Yoast SEO tạo, thì bạn cần thêm đoạn mã sau vào file function.php để nó thay đổi lại link ảnh:

/**
* SEO CDN Images
*
*
*/
function image_seo_fix( $uri ) {
return str_replace( 'https://ten-mien-cua-ban.com', 'https://ten-mien-cdn.com', $uri );
}
add_filter( 'wpseo_xml_sitemap_img_src', 'image_seo_fix' );

Lưu file function.php, sau đó bạn vào sitemap để kiểm tra:

kiencang.net/post-sitemap.xml

Thay ducanhplus bằng tên miền của bạn vào, rồi chuột phải nhấn xem nguồn trang:

sitemap cập nhật ảnh lưu ở CDN

Nếu bạn thấy tên miền CDN đã được thay vào thì là ổn.

Phải mất một thời gian nữa thì chỉ mục ảnh của trang ducanhplus mới lên được, vì trước đó trang của tôi do không biết còn để mặc định chặn bọ tìm kiếm cho ảnh CDN!

Các trang web lớn đang xử lý các vấn đề liên quan đến CDN như thế nào

1. Backlinko.com

Đây là trang web chuyên về SEO mà tôi rất hay tham khảo, đầu năm 2019, Brain Dean bắt đầu áp dụng CDN cho trang web này. Anh ta sử dụng CDN của hosting Pressidium – thuộc nhóm hosting dành cho phân khúc cao cấp.

File robots.txt của nội dung CDN: https://cdn-backlinko.pressidium.com/robots.txt

User-agent: *
Allow: /wp-content/
Allow: /wp-includes/
Disallow: /

Điều này nghĩa là cho tất cả các bọ tìm kiếm xem thư mục wp-content và wp-includes, và chỉ 2 thư mục này mà thôi, đây là các thư mục chứa ảnh, css, js và các thành phần làm nội dung của trang. Backlinko để nội dung robots.txt giống nhau ở cả nội dung chính và nội dung CDN, đây là thực hành thông minh & an toàn. Bản thân trang Đức Anh Plus (Kiến càng) cũng làm tương tự

Kiểm tra về Canonical các nội dung CDN đều được trỏ về nội dung gốc:

HTML:

html trỏ về nội dung gốc

Ảnh:

ảnh trỏ về nội dung gốc

Về sitemap thì Backlinko không sửa đổi để ảnh ở CDN được đưa vào thay ảnh gốc. Anh ta vẫn dùng link ảnh gốc trong file XML:

sitemap của backlinko

Bạn có thể xem sitemap của backlinko ở đây: https://backlinko.com/post-sitemap.xml

Ngoài ra thì tên miền CDN của trang này không phải là tên miền dạng subdomain của tên miền gốc.

2. Moz.com

Moz cũng có nhiều bài viết hay về SEO, thi thoảng tôi cũng tham khảo ở đây.

Vào khu vực blog của trang thì thấy Moz đang sử dụng CDN của cloudfront – là CDN của Amazon.

Moz cũng không sử dụng tên miền tùy chỉnh dạng subdomain riêng cho CDN, ngoài ra có vẻ Moz chỉ dùng CDN cho ảnh mà thôi, không thấy CDN cho JS hay CSS.

Mình không kiểm tra được file robots.txt cho nội dung CDN của trang này.

Về Canonical, kết quả cho thấy Moz cũng không sử dụng cho ảnh:

Moz không có Canonical

3. Wpbeginner.com

Trang chuyên về WordPress, đặc biệt là cho người mới, nhiều bạn chắc biết trang này.

WPBeginner sử dụng CDN dạng tên miền tùy chỉnh là subdomain của tên miền gốc: cdn.wpbeginner.com

File robots.txt của phần nội dung CDN như sau:

User-Agent: *
Allow: /?display=wide
Allow: /wp-content/uploads/
Disallow: /wp-content/plugins/
Disallow: /readme.html
Disallow: /refer/

Sitemap: https://www.wpbeginner.com/post-sitemap.xml
Sitemap: https://www.wpbeginner.com/page-sitemap.xml
Sitemap: https://www.wpbeginner.com/deals-sitemap.xml
Sitemap: https://www.wpbeginner.com/hosting-sitemap.xml

Trang này cho phép xem nội dung CDN nằm tại thư mục wp-content, không cho xem plugin. Đáng chú ý là họ bổ sung sitemap thêm vào nữa, và đây là sitemap của trang gốc, ý để chỉ rằng CDN chỉ là nội dung sao chép.

Cũng tương tự Backlinko, robots.txt của CDN và của trang web gốc của WPBeginner hoàn toàn giống nhau.

Về Canonical, không thấy WP Beginner áp dụng cho ảnh:

WP Beginer không có canonical cho ảnh

Dĩ nhiên về html thì có Canonical.

Còn về sitemap, WPBeginner cũng không chỉnh sửa để ảnh CDN được đưa vào đây mà vẫn để như mặc định:

vẫn để ảnh nội dung gốc không phải ảnh CDN

4. seo-hacker.com

SEO-hacker sử dụng CDN của MaxCDN (Stackpath), và không phải là dạng tên miền tùy chỉnh subdomain.

Nội dung file robots.txt của CDN: https://seohackercdn-seohacker.netdna-ssl.com/robots.txt

User-agent: *
Allow: /wp/wp-admin/admin-ajax.php
Disallow: /wp/wp-admin/
Disallow: /category/
Disallow: /tag/
Disallow: /page/
Disallow: /wp-content/plugins/
Disallow: /wp-includes/

Sitemap: https://seo-hacker.com/sitemap.xml

SEO-hacker có vẻ chặn khá nhiều, nhưng dĩ nhiên họ không chặn thư mục wp-content, vốn chứa nội dung CDN.

Một lần nữa file robots.txt của nội dung gốc: https://seo-hacker.com/robots.txt cũng giống y file robots.txt của CDN.

Về Canonical, không thấy SEO-hacker dùng cho ảnh:

seohacker không dùng canonical cho ảnh

Khi kiểm tra sitemap thì tôi không tìm thấy phần hình ảnh: https://seo-hacker.com/sitemap.xml

5. crunchify.com

Đây là trang có vẻ tuân thủ đủ nhất các tối ưu SEO cho CDN.

Họ có áp dụng tên miền CDN tùy chỉnh tải địa chỉ: https://cdn.crunchify.com

File robots.txt của CDN và nội dung gốc giống nhau:

User-agent: *
Disallow: /refer/

Sitemap: https://crunchify.com/sitemap_index.xml

Về Canonical họ có áp dụng cho ảnh và cả các nội dung khác:

crunchify có áp dụng canonical cho ảnh

Về sitemap: https://crunchify.com/post-sitemap.xml, Crunchify là trang duy nhất có áp dụng link CDN trong ảnh cho sitemap:

crunchify áp dụng link CDN ảnh cho sitemap

Qua 5 trang web trên chúng ta có thể rút ra một số kết luận sau:

  • File robots.txt của CDN không được phép chặn nội dung bọ tìm kiếm quét ảnh, CSS, JS hoặc các nguồn tài nguyên quan trọng khác cho SEO
  • Cách thực hành phổ biến nhất là để file robots.txt của CDN giống với file robots.txt của nội dung gốc
  • Tên miền tùy chỉnh CDN dạng subdomain có vẻ không quan trọng, nhiều trang không áp dụng cách này
  • Việc sử dụng Canonical cho CDN html là yêu cầu bắt buộc và các trang được khảo sát đều áp dụng
  • Tuy nhiên Canonical cho ảnh có vẻ không được coi trọng, bằng chứng là chỉ một trang trong số năm trang được khảo sát áp dụng cách này, như vậy việc Google không sử dụng Canonical cho ảnh dường như là chính xác
  • Sitemap sử dụng link ảnh CDN cũng không được áp dụng nhiều, cũng chỉ có một trên năm trang làm cách này

8 thoughts on “Xử lý vấn đề trùng lặp nội dung khi sử dụng CDN cho Website”

  1. Cảm bạn với bài viết rất chi tiết và bổ ích. mình có một vấn đề muốn hỏi?
    – Mình đang test thử BizFly CDN, bạn đã dùng bên này chưa có thể cho mình ít kinh nghiệm review đc k?
    – Hiện tại mình check file robots.txt trên tên miền cdn: domain-cua-minh.cdn.vccloud.vn. hiện thị như sau:
    User-agent: *
    Allow: /*.*
    Disallow: /
    Mình các URL trên CDN đều có thẻ canonical trỏ về bài viết gốc tương ứng với site của mình.
    Mình có liên hệ với bên BizFly CDN để edit lại rule file robots.txt thì bên đó bảo đây là cấu hình ko sửa đổi được.
    Khi mình đọc được bài viết của bạn thì mình hơi hoang mang liệu cấu hình robots.txt trên để thế có được không? có ảnh hưởng gì đến việc lập chỉ mục và SEO không? Cảm ơn bạn.

    Reply
    • Chào bạn, mình chưa dùng BizFly CDN bao giờ nhưng có nghe nói đến. Họ có sử dụng thẻ canonical để trỏ nội dung gốc thì làm đúng rồi, vì đề báo cho Google biết đâu là nội dung gốc, tuy nhiên lại chặn bọ tìm kiếm lập chỉ mục nội dung CDN thì theo mình là không ổn.

      Reply
  2. 06/2020. Sau khi đã thêm đoạn canonical vào htaccess và check tại https://www.seoreviewtools.com/canonical-url-location-checker/ thì Ảnh nó đã trỏ về trang chính rồi. Vậy có cần phải thêm hàm này nữa không bạn ?

    Mình cũng đang dùng Yoast SEO, CDN của CloudFront (Amazon).

    function image_seo_fix( $uri ) {
    return str_replace( ‘https://ten-mien-cua-ban.com’, ‘https://ten-mien-cdn.com’, $uri );
    }
    add_filter( ‘wpseo_xml_sitemap_img_src’, ‘image_seo_fix’ );

    Bạn replay lại giúp mình với nhé.
    Thanks!

    Reply
    • Chào bạn, ai cẩn thận thì vẫn thêm vào, nhưng tôi thì thấy không cần. Trước tôi cũng có thêm, nhưng một thời gian thì không làm nữa, quan trọng là cái canonical là mình phải có là được. Bạn tự đăng ký CloudFront đề dùng CDN à, hay bạn dùng ứng dụng của bên thứ ba để tích hợp vào?

      Reply
      • Mình cũng không thêm đoạn code trên vì mình nghĩ dùng canonical ở trong htacess như trên là đủ rồi. Về Cloudfront thì mình tự đăng ký Free của Amazon rồi cài cùng plugin wp-rocket thôi bạn ah.

        Reply
        • Hay quá bạn Mạnh, tôi cũng thích Cloudfront lắm, thấy nhiều trang công nghệ nước ngoài hay dùng, lúc nào phải thử mới được.

          Reply
  3. Chào bạn DUC ANH NGUYEN,
    Bạn có thể cho mình hỏi chút không? Mình thấy trang của bạn có điểm số pagespeed rất cao. Mình cũng sử dụng theme Astra cho một số trang (ví dụ như trang: phiendichtienganh.net), đã tối ưu đủ kiểu nhưng điểm số vẫn chưa được như ý muốn.

    Mình có check thì thấy Hosting provider của bạn là Google, bạn có thể gợi ý mua gói host nào của google hoặc VPS server ở đâu ko?
    Cảm ơn bạn!

    Tại chính trang này của bạn, mình check thấy:
    Mobile: 92, Desktop: 100 điểm. Cao kinh dị luôn!!!

    Reply
    • Chào bạn Mạnh, trang này tôi dùng host của Google Cloud, CDN của Google nốt, còn webserver của LiteSpeed, plugin LiteSpeed Cache, toàn hàng khủng nên điểm chác cũng dễ lên hơn. Bạn có thể dùng host của Closte để sử dụng các dịch vụ trên (tham khảo thêm bài: https://chimcat.net/closte-host/). Tuy nhiên trang này điểm số cao phần nhiều là vì nó cũng đơn giản nữa, chứ trang phức tạp kiểu bạn chèn video YouTube vào, rồi nhiều mã của bên thứ ba điểm khó cao lắm… Bạn đừng bị ám ảnh bởi điểm số tốc độ, nó ở mức khá là được, quan trọng nhất vẫn là chất lượng nội dung và dịch vụ. Bạn đọc được tiếng Anh có thể tham khảo bài viết (hình như của bạn gốc Việt) này: https://wpjohnny.com/google-pagespeed-pingdom-and-gtmetrix-scores-dont-matter/ để thấy điểm số tốc độ là thứ phù phiếm thế nào. Sắp tới tôi cũng chuyển ngữ bài này sang tiếng Việt.

      Reply

Leave a Comment