Bài viết được biên dịch và Việt hóa từ tài liệu chính thức "Designing a URL structure for ecommerce websites" của Google Search Central. Đây là bài kỹ thuật chuyên sâu dành cho developer, technical SEO và ecommerce manager muốn xây dựng cấu trúc URL tối ưu cho Google ngay từ đầu.
URL — Phần "vô hình" nhưng quyết định thành bại
Hãy thử tưởng tượng 2 website ecommerce cùng bán áo thun:
Website A:
https://shop-a.com/product?id=12345&cat=789&sort=price&filter=redWebsite B:
https://shop-b.com/ao-thun-nam/cotton-trangBạn click vào cái nào? 99% người sẽ chọn Website B. Và Google cũng vậy.
URL không chỉ là "đường dẫn" — nó là:
First impression với user (trong SERP)
Signal mạnh cho Google về nội dung
Crawl efficiency quyết định
Internal linking foundation
Trust factor quan trọng
Với ecommerce, URL còn quan trọng hơn nhiều lần vì hàng nghìn đến hàng triệu trang; filter, sort, variant tạo combinations vô tận; pagination phức tạp; và duplicate content risk cao. Đây chính là lý do SEO cho website bán hàng luôn phải bắt đầu từ nền tảng kỹ thuật, chứ không chỉ nội dung.
Google đã viết tài liệu kỹ thuật chuyên biệt về URL Structure cho Ecommerce. Đây là tài liệu bắt buộc đọc cho mọi developer xây dựng platform ecommerce hoặc fix legacy site.
Bài viết này dành cho: developer xây dựng ecommerce platform; technical SEO chuyên về ecommerce; ecommerce manager cần hiểu để giao việc cho dev; và owner của shop online đang gặp vấn đề SEO.
Phần 1: Tại sao URL Structure quan trọng?
1.1. Ba hậu quả nghiêm trọng khi URL structure tệ
Vấn đề 1: Content bị MISS (bỏ sót)
Content có thể bị bỏ sót nếu Googlebot cho rằng 2 URL trả về cùng nội dung — chỉ một URL được crawler lấy về (cái còn lại bị loại như duplicate).
Ví dụ Google đưa ra:
/product/t-shirt#black
/product/t-shirt#white→ Google coi đây là cùng 1 trang vì fragment identifier (#) KHÔNG được dùng trong indexing.
🚨 Hậu quả tại VN: Nhiều shop dùng # để switch variant → Google chỉ index 1 variant, bỏ sót các variant khác.
Vấn đề 2: Crawl LÃNG PHÍ
Cùng một nội dung có thể bị lấy về nhiều lần nếu Google nghĩ 2 URL là khác nhau nhưng thực ra trả về cùng một trang. Điều này có thể làm chậm việc crawl site của bạn.
Ví dụ Google đưa ra:
/product/black-t-shirt ← URL 1
/product?sku=1234 ← URL 2→ Cả 2 có thể return cùng product, nhưng Google không biết cho đến khi crawl cả 2.
🚨 Hậu quả: Crawl budget lãng phí, server tải nặng, các trang quan trọng khác bị bỏ sót.
Vấn đề 3: INFINITE pages (vô tận trang)
Crawler có thể nghĩ site của bạn chứa vô số trang nếu URL bao gồm giá trị thay đổi liên tục như timestamp.
Ví dụ Google đưa ra:
/about?now=12:34am
/about?now=12:35am
/about?now=12:36am
...→ Google coi mỗi URL là khác nhau → crawl vô tận → không bao giờ index xong site.
🚨 Hậu quả tại VN: Shop dùng tracking parameters động (timestamp, session-id) → Google bị "kẹt" crawl.
Phần 2: Best Practices URL Structure — General Recommendations
Google đưa ra 4 nguyên tắc vàng cho URL structure tốt.
Nguyên tắc 1: Minimize alternative URLs
Giảm thiểu số lượng URL thay thế trả về cùng nội dung để tránh việc Google gửi nhiều request hơn mức cần thiết đến site của bạn.
Lý do: Google không biết 2 URL về cùng content cho đến khi crawl cả 2. Mỗi URL "trùng" = 1 crawl request lãng phí.
Hành động cụ thể: Một content = một URL chính (canonical); loại bỏ URL không cần thiết; redirect 301 từ URL cũ về URL mới; implement canonical tags.
Nguyên tắc 2: Consistent case (chữ hoa/thường)
Nếu chữ hoa và chữ thường trong URL được web server xử lý như nhau, hãy chuyển tất cả về cùng một dạng để Google dễ dàng xác định các URL cùng trỏ về một trang.
Nếu server treat case-insensitive (mặc định ở Windows server):
/Product/Black-T-Shirt
/product/black-t-shirt
/PRODUCT/BLACK-T-SHIRT→ Tất cả return cùng trang → Google có thể crawl cả 3 → lãng phí.
Giải pháp: Tất cả URL dùng lowercase; server-level redirect uppercase → lowercase; internal links luôn dùng lowercase.
Code minh họa (Nginx):
nginx
# Redirect tất cả uppercase URLs về lowercase
if ($request_uri ~ [A-Z]) {
rewrite ^(.*)$ $1 last;
}Nguyên tắc 3: Unique URL cho mỗi paginated page
Đảm bảo mỗi trang trong kết quả phân trang có URL riêng biệt. Chúng tôi thấy hầu hết lỗi URL nằm ở cấu trúc URL phân trang.
🎯 Google thừa nhận: pagination là nơi developer mắc lỗi nhiều nhất.
Ví dụ pagination tốt:
/ao-thun-nam ← Page 1 (canonical)
/ao-thun-nam?page=2 ← Page 2
/ao-thun-nam?page=3 ← Page 3Ví dụ pagination sai:
/ao-thun-nam ← Page 1
/ao-thun-nam#page2 ← Page 2 (Google không hiểu)
/ao-thun-nam ← Page 3 (cùng URL với Page 1, content load qua AJAX)Nguyên tắc 4: Descriptive words trong URL paths
Thêm các từ mô tả trong đường dẫn URL. Các từ trong URL có thể giúp Google hiểu trang tốt hơn.
✅ Recommended:
/product/black-t-shirt-with-a-white-collar❌ Not recommended:
/product/3243Áp dụng cho VN:
✅ /ao-thun-nam-cotton-trang
✅ /serum-vitamin-c-the-ordinary
✅ /iphone-16-pro-max-256gb-titan-tu-nhien
❌ /p/12345
❌ /product?id=999
❌ /item.php?code=ABCLưu ý cho tiếng Việt: KHÔNG dùng dấu trong URL (ao-thun thay vì áo-thun); dùng dấu gạch ngang (-) thay khoảng cách; ngắn gọn nhưng có ý nghĩa; có từ khóa chính một cách tự nhiên.
Phần 3: Query Parameters — Quy tắc vàng
Query parameters (?key=value) là phần phức tạp nhất của URL ecommerce. Google đưa ra 3 quy tắc quan trọng.
Quy tắc 1: Dùng ?key=value, không phải ?value
Dùng URL parameter dạng
?key=valuethay vì?valuekhi có thể.
Format ?key=value giúp Google hiểu được semantic của parameter.
✅ /photo-frames?page=2
✅ /t-shirt?color=green
❌ /photo-frames?2
❌ /t-shirt?green→ Với format ?2, Google không biết "2" là gì — page number? size? color?
Quy tắc 2: Avoid duplicate parameters
Tránh dùng cùng một parameter hai lần. Nếu không, Googlebot có thể bỏ qua một trong các giá trị.
✅ ?type=candy,sweet
❌ ?type=candy&type=sweetÁp dụng cho ecommerce:
✅ /ao-thun?color=red,blue,green
✅ /ao-thun?size=S,M,L
❌ /ao-thun?color=red&color=blue&color=green
❌ /ao-thun?size=S&size=M&size=LQuy tắc 3: Avoid temporary/dynamic parameters
Tránh internal link đến các parameter tạm thời như session-ID, tracking code, giá trị tương đối theo user (location=nearby, time=last-week), và thời gian hiện tại.
✅ /t-shirt?location=UK
❌ /t-shirt?location=nearby ← Relative, mỗi user khác nhau
❌ /t-shirt?current-time=12:02 ← Thay đổi mỗi phút
❌ /t-shirt?session=123123123 ← Thay đổi mỗi user🚨 Tracking parameters phổ biến cần xử lý: ?utm_source=, ?fbclid=, ?gclid=, ?ref=, ?sid=, ?aff=. Các URL này KHÔNG nên được index — dùng canonical về URL gốc.
Phần 4: Product Variants — URL Structure cho sản phẩm có biến thể
4.1. Product Variant là gì?
Mỗi tổ hợp các thuộc tính sản phẩm được gọi là một product variant.
Ví dụ áo thun có Color (Đỏ, Xanh, Trắng, Đen) và Size (S, M, L, XL) → mỗi tổ hợp (vd: Đỏ + M) = 1 variant → tổng 4 × 4 = 16 variants.
4.2. Mỗi variant cần URL riêng
Để giúp Google hiểu các product variant, hãy đảm bảo mỗi variant có thể được nhận diện bằng một URL riêng.
4.3. Hai phương pháp URL cho variants
Phương pháp 1: Path Segment
/t-shirt/green
/t-shirt/red
/t-shirt/blueƯu điểm: URL ngắn gọn, đẹp, SEO-friendly, dễ nhớ. Nhược điểm: khó scale với nhiều attributes, cần routing config phức tạp.
Phương pháp 2: Query Parameter
/t-shirt?color=green
/t-shirt?color=red
/t-shirt?color=blueƯu điểm: dễ implement, scale tốt với nhiều attributes, filter UI dễ build. Nhược điểm: URL dài hơn, cần canonical management tốt.
4.4. Canonical strategy cho variants
Nếu bạn dùng query parameter tùy chọn để nhận diện variant, hãy dùng URL với query parameter bị bỏ đi làm canonical URL.
Sơ đồ minh họa:
URL Canonical (mặc định):
/t-shirt ← KHÔNG có color parameter
URLs Variants:
/t-shirt?color=blue ← canonical → /t-shirt
/t-shirt?color=red ← canonical → /t-shirt
/t-shirt?color=green ← canonical → /t-shirtCode minh họa:
html
<!-- Trang /t-shirt?color=blue -->
<head>
<link rel="canonical" href="https://shop.com/t-shirt">
</head>
<!-- Trang /t-shirt?color=red -->
<head>
<link rel="canonical" href="https://shop.com/t-shirt">
</head>4.5. Mở rộng: Khi variant là sản phẩm thực sự khác
⚠️ Đôi khi "variant" có thể là sản phẩm hoàn toàn khác, không chỉ thay đổi nhỏ:
"iPhone 16" và "iPhone 16 Pro" → sản phẩm khác, không phải variants
"Áo thun M" và "Áo thun XL" → variants (cùng sản phẩm)
→ Phân biệt đúng để có canonical strategy đúng.
Phần 5: Best Practices khi dùng URLs trong Content
5.1. Consistency là chìa khóa
Dùng cùng một URL trong internal link, sitemap và thẻ
<link rel="canonical">.
❌ Sai: sitemap có /category, internal link có /category?page=1, canonical có /category → Google bị confuse → có thể chọn URL không như mong đợi.
5.2. Self-referencing canonical
Dùng thẻ
<link rel="canonical">tự trỏ (URL trong thẻ trỏ về chính trang đó) trên tất cả các trang cần index.
html
<!-- Trang https://shop.com/ao-thun -->
<head>
<link rel="canonical" href="https://shop.com/ao-thun">
</head>→ Đây là best practice ngay cả khi không có duplicate content.
5.3. Canonical cho variants
Đặt canonical product URL trên tất cả các trang variant bằng thẻ
<link rel="canonical">.
html
<!-- Trang /t-shirt/green -->
<head>
<link rel="canonical" href="https://shop.com/t-shirt">
</head>5.4. Internal links phải dùng <a href>
Đặt link trực tiếp trên trang bằng thẻ
<a href>; KHÔNG dùng JavaScript để điều hướng giữa các trang.
Googlebot có thể không detect navigation từ JavaScript code. Đây cũng là một hạng mục trong checklist Technical SEO mà nhiều website bỏ sót.
html
❌ Xấu:
<div onclick="navigate('/category')">Categories</div>
<button onclick="window.location='/cart'">Cart</button>
✅ Tốt:
<a href="/category">Categories</a>
<a href="/cart">Cart</a>5.5. Anchor text có ý nghĩa
Đặt văn bản có ý nghĩa giữa
<a href>và</a>, chẳng hạn tên sản phẩm được liên kết đến. Đừng dùng cụm chung chung như "click here".
html
❌ Xấu:
<a href="/ao-thun-trang">Click here</a>
<a href="/ao-thun-trang">Xem thêm</a>
✅ Tốt:
<a href="/ao-thun-trang">Áo thun nam cotton trắng</a>
<a href="/ao-thun-trang">
<img src="ao.jpg" alt="Áo thun nam cotton trắng">
</a>5.6. Tránh link đến/index trang trống
Tránh link đến, hoặc ít nhất index, các trang không có nội dung hữu ích.
Tình huống thường gặp: category page không có sản phẩm; trang sản phẩm đã hết hàng vĩnh viễn; search results page rỗng.
Khuyến nghị từ Google: nếu trang tạm rỗng dùng <meta name="robots" content="noindex">; nếu category bị xóa khỏi search/browse thì trả về HTTP 404.
Phần 6: Cấu trúc URL chuẩn cho Ecommerce Việt Nam
6.1. Cấu trúc tổng thể
shop.com/ ← Homepage
shop.com/danh-muc/ ← All categories
shop.com/danh-muc/{category-slug}/ ← Category page
shop.com/danh-muc/{category-slug}/{sub-category}/ ← Sub-category
shop.com/san-pham/{product-slug} ← Product page
shop.com/blog/ ← Blog
shop.com/blog/{post-slug} ← Blog post
shop.com/gioi-thieu ← About
shop.com/lien-he ← Contact
shop.com/chinh-sach/{policy-slug} ← Policies6.2. Ví dụ cụ thể
✅ shop.com/danh-muc/quan-ao-nam/
✅ shop.com/danh-muc/quan-ao-nam/ao-thun/
✅ shop.com/san-pham/ao-thun-nam-cotton-trang
✅ shop.com/san-pham/ao-thun-nam-cotton-trang?color=blue
✅ shop.com/blog/cach-chon-ao-thun-phu-hop-voi-dang-nguoi6.3. URL nên TRÁNH
❌ shop.com/index.php?cat=12
❌ shop.com/product/12345.html
❌ shop.com/ao-thun-cotton/?sid=abc123
❌ shop.com/AoThunNam/CottonTrang ← Camel case
❌ shop.com/ao_thun_nam ← Underscore thay vì hyphen
❌ shop.com/áo-thun-nam ← Có dấu (gây issues encoding)
❌ shop.com/ao-thun-nam-co-ban-tot-nhat-2026-gia-re-chinh-hang ← Quá dài6.4. Quy tắc đặt URL slug
Dùng tiếng Việt KHÔNG dấu —
ao-thun-nam, khôngáo-thun-namDùng hyphen (
-), không underscore (_)Lowercase 100% —
/san-pham/, không/San-Pham/Ngắn gọn — tối đa 5–7 từ
Có từ khóa chính — nhưng không nhồi nhét
Trailing slash nhất quán — chọn 1 format và giữ consistent
Phần 7: Common Mistakes & Solutions
Mistake 1: Faceted Navigation tạo hàng triệu URLs
Site có filter: Color (10), Size (5), Brand (20), Price ranges (5) → mỗi combination tạo 1 URL → 10 × 5 × 20 × 5 = 5.000 URLs cho 1 category. Với 100 categories → 500.000 URLs trùng lặp. Đây là nguyên nhân số một gây lãng phí crawl budget — xem chi tiết cách xử lý trong bài Crawl Budget cho website hàng nghìn trang.
html
<!-- Canonical về URL gốc -->
<link rel="canonical" href="https://shop.com/ao-thun">
<!-- HOẶC noindex các trang filter -->
<meta name="robots" content="noindex">Hoặc trong robots.txt:
Disallow: /*?color=
Disallow: /*?size=
Disallow: /*?brand=⚠️ Cẩn thận: robots.txt chặn crawl nhưng KHÔNG noindex. Dùng kết hợp.
Mistake 2: Session IDs trong URL
/ao-thun?session=abc123
/ao-thun?session=def456→ Mỗi user = 1 URL mới → infinite URLs. Giải pháp: dùng cookies cho session, hoặc canonical về URL không session.
Mistake 3: Trailing slash inconsistent
/ao-thun và /ao-thun/ đều accessible → Google có thể coi là 2 URLs. Giải pháp: chọn 1 và redirect 301.
nginx
# Nginx: Remove trailing slash
rewrite ^/(.*)/$ /$1 permanent;Mistake 4: URL có và không có www
https://shop.com/ao-thun và https://www.shop.com/ao-thun → redirect 301 về phiên bản chính.
nginx
# Redirect www → non-www
server {
server_name www.shop.com;
return 301 https://shop.com$request_uri;
}Mistake 5: HTTP và HTTPS đều accessible
nginx
server {
listen 80;
return 301 https://$host$request_uri;
}Mistake 6: Hết hàng → 404
Sản phẩm hết hàng tạm thời mà trả 404 → mất ranking. Nếu hết hàng tạm thời: giữ trang, đánh dấu "Hết hàng", gợi ý sản phẩm tương tự. Nếu hết hàng vĩnh viễn: 301 redirect về category gần nhất hoặc sản phẩm thay thế.
Mistake 7: Dùng JavaScript cho navigation
html
❌ <div onclick="loadCategory('ao-thun')">Áo thun</div>
✅ <a href="/danh-muc/ao-thun">Áo thun</a>→ Có thể giữ JS để enhance UX, nhưng base HTML phải có <a href>.
Phần 8: Checklist URL Structure Audit
Nhóm 1: URL Format
URLs có ý nghĩa, không phải ID số
URLs dùng lowercase 100%
URLs dùng hyphen (
-), không underscore (_)URLs không có dấu tiếng Việt
URLs không quá dài (max 5–7 từ)
Trailing slash consistent
HTTPS bắt buộc
www/non-www chỉ chọn 1
Nhóm 2: Query Parameters
Dùng
?key=valueformatKhông duplicate parameters
Không session IDs trong URL
Không tracking parameters bị index
Không timestamp/dynamic values
Nhóm 3: Product Variants
Mỗi variant có URL riêng
Canonical về URL không có query param
Variant linkage rõ ràng
Nhóm 4: Pagination
Mỗi page có unique URL
Pagination dùng
<a href>(crawlable)Không dùng
#cho paginationPage 1 có canonical chuẩn
Nhóm 5: Faceted Navigation
Filters có canonical hợp lý
robots.txtblock các filter combinationsHoặc noindex các filter pages
Internal links không trỏ đến filter URLs
Nhóm 6: Empty/Error Pages
Empty category → noindex
Sản phẩm xóa vĩnh viễn → 301 redirect hoặc 404
Sản phẩm hết hàng tạm thời → giữ trang
Phần 9: Implementation Guide cho các Platform phổ biến
9.1. WordPress (WooCommerce)
Plugin recommended: Yoast SEO hoặc Rank Math (canonical management); WP Rocket (performance + URL optimization).
Settings → Permalinks → Custom Structure:
/%category%/%postname%/
WooCommerce → Settings → Products → General:
Product permalinks: /san-pham/
Category base: /danh-muc/Code snippet để handle filter URLs:
php
// functions.php
add_filter('woocommerce_get_canonical_url', function($url) {
// Remove tracking parameters
$url = remove_query_arg(['utm_source', 'fbclid', 'gclid'], $url);
return $url;
});9.2. Shopify
Built-in: auto canonical tags, pretty URLs, HTTPS mặc định.
liquid
<!-- theme.liquid -->
<link rel="canonical" href="{{ canonical_url }}">
{% if template == 'product' %}
<!-- Variant canonical -->
<link rel="canonical" href="{{ product.url }}">
{% endif %}9.3. Magento 2
Stores → Configuration → Web → URL Options:
- Add Store Code to Urls: No
- Auto-redirect to Base URL: Yes (301)
Stores → Configuration → Catalog → Search Engine Optimization:
- Use Categories Path for Product URLs: No (để URL ngắn hơn)
- Create Permanent Redirect: Yes9.4. Custom platform
Nếu build từ đầu: routing layer (Express, Laravel, Django); middleware (force lowercase, HTTPS, canonical); database (slug field cho mỗi entity); caching (Redis/CDN cho URL lookups).
js
// Force lowercase URLs
app.use((req, res, next) => {
if (req.path !== req.path.toLowerCase()) {
return res.redirect(301, req.path.toLowerCase());
}
next();
});
// Force HTTPS
app.use((req, res, next) => {
if (req.header('x-forwarded-proto') !== 'https') {
return res.redirect(301, `https://${req.header('host')}${req.url}`);
}
next();
});Phần 10: URL Migration — Khi cần đổi cấu trúc
Tình huống phổ biến: site cũ có URL tệ → cần migrate sang URL mới tốt hơn.
10.1. Quy trình migration an toàn
Bước 1: Lập map URL cũ → mới
URL Cũ → URL Mới
/p?id=12345 → /ao-thun-nam-cotton-trang
/category.php?cat=789 → /danh-muc/ao-thun-nam
/index.php?page=about → /gioi-thieuBước 2: Implement 301 redirects
nginx
rewrite ^/p?id=12345$ /ao-thun-nam-cotton-trang permanent;
rewrite ^/category\.php\?cat=789$ /danh-muc/ao-thun-nam permanent;Bước 3: Update internal links — sitemap, navigation, footer, internal cross-links.
Bước 4: Update canonical tags
html
<link rel="canonical" href="https://shop.com/ao-thun-nam-cotton-trang">Bước 5: Submit sitemap mới + Request indexing — submit XML sitemap với URLs mới; URL Inspection → Request indexing cho top pages.
Bước 6: Monitor — daily check Search Console; watch for 404 errors; monitor traffic recovery.
10.2. Thời gian recovery
Site size | Thời gian Google recrawl |
|---|---|
< 1.000 URLs | 1–2 tuần |
1.000–10.000 URLs | 2–4 tuần |
10.000–100.000 URLs | 1–3 tháng |
> 100.000 URLs | 3–6 tháng |
URL Structure — Đầu tư một lần, hưởng lợi mãi mãi
URL structure là một trong những nền tảng quan trọng nhất của ecommerce SEO. Làm đúng ngay từ đầu → tiết kiệm hàng năm refactor sau này.
5 thông điệp cuối:
Mỗi content = một URL chính. Đừng để duplicate URLs làm lãng phí crawl budget.
Descriptive > Cryptic. URL có ý nghĩa luôn tốt hơn ID số.
Consistency là king. Format URL phải nhất quán toàn site.
Variants cần URL riêng + Canonical đúng. Đây là điểm phức tạp nhất.
Migration là rủi ro cao. Plan kỹ, redirect đầy đủ, monitor liên tục.
Tài liệu tham khảo chính thức
Bài viết được biên soạn từ tài liệu chính thức Google Search Central (cập nhật 10/12/2025): Designing a URL structure for ecommerce sites; Help Google understand your site structure; Consolidate duplicate URLs; Managing faceted navigation; Product variants structured data. Phần phân tích, code examples, checklist và implementation guide thuộc về Tấn Phát Digital.
Về Tấn Phát Digital
Tấn Phát Digital có kinh nghiệm migration URL cho hàng chục ecommerce site lớn tại VN. Chúng tôi cung cấp dịch vụ SEO Website bao gồm: URL Architecture Audit — đánh giá hiện trạng URL structure; URL Migration Service — an toàn không mất SEO juice; Faceted Navigation Setup — tối ưu filter cho ecommerce lớn; và Multi-platform expertise — WordPress, Shopify, Magento, Custom.
SEO Ecommerce không chỉ nằm ở nội dung hay backlink — mà còn bắt đầu từ nền tảng kỹ thuật như cấu trúc URL.
Nếu bạn muốn xây dựng website bán hàng chuẩn SEO và tối ưu technical SEO toàn diện, hãy liên hệ Tấn Phát Digital để được tư vấn.







