Optimizely CMS 12 (trước đây là EPiServer) là một nền tảng mạnh mẽ, nhưng logic phân đoạn URL mặc định thường không xử lý tốt các ký tự không thuộc bảng chữ cái Latin. Đối với nội dung Tiếng Việt, CMS thường loại bỏ dấu không chính xác hoặc làm mất các ký tự đặc biệt như "đ", dẫn đến các slug URL bị hỏng, khó đọc và ảnh hưởng tiêu cực đến SEO.
Trong hướng dẫn này, chúng ta sẽ triển khai một giải pháp tự động tạo URL slug thân thiện với SEO cho Tiếng Việt mỗi khi nội dung được lưu.
Bước 1: Tạo lớp chuẩn hóa Slug (UrlSlugNormalizer)
Logic cốt lõi nằm trong một lớp tiện ích tĩnh. Chúng ta sử dụng Canonical Decomposition (FormD) để tách các dấu ra khỏi ký tự gốc. Vì chữ "đ" trong Tiếng Việt không thể tách bằng chuẩn Unicode thông thường, chúng ta sẽ xử lý thủ công.
File: CmsIv.Web/Business/UrlSlugNormalizer.cs
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
namespace CmsIv.Web.Business
{
public static class UrlSlugNormalizer
{
public static string NormalizeToSlug(string text)
{
if (string.IsNullOrWhiteSpace(text))
return string.Empty;
// Xử lý riêng chữ 'đ' và 'Đ'
string processedText = text.Replace('đ', 'd').Replace('Đ', 'D');
// Bước 1: Sử dụng NFD để tách dấu
string decomposed = processedText.Normalize(NormalizationForm.FormD);
// Bước 2: Loại bỏ các ký tự dấu (NonSpacingMark)
var result = new StringBuilder();
foreach (char c in decomposed)
{
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
{
result.Append(c);
}
}
string normalized = result.ToString();
// Bước 3: Chuyển chữ thường, thay khoảng trắng bằng dấu gạch ngang
normalized = normalized.ToLowerInvariant();
normalized = Regex.Replace(normalized, @"\s+", "-");
normalized = Regex.Replace(normalized, @"[^a-z0-9\-]", string.Empty);
normalized = Regex.Replace(normalized, @"-+", "-");
return normalized.Trim('-');
}
}
}
Bước 2: Triển khai Module khởi tạo
Chúng ta sử dụng IInitializableModule để đăng ký sự kiện IContentEvents.SavingContent. Điều này cho phép chúng ta can thiệp vào quá trình lưu và sửa đổi URLSegment trước khi dữ liệu được ghi xuống database.
File: CmsIv.Web/Initialization/VietnameseUrlSlugModule.cs
// (Mã nguồn tương tự phần tiếng Anh, sử dụng logic IInitializableModule)
Bước 3: Kiểm tra với Unit Test
Việc kiểm thử tự động giúp đảm bảo các trường hợp đặc biệt (như nhiều khoảng trắng hoặc dấu câu) được xử lý chính xác trên tất cả các dấu thanh Tiếng Việt.
Kinh nghiệm và Giải quyết sự cố
- Xử lý chữ 'đ': Hãy nhớ rằng
FormDkhông chuyển 'đ' thành 'd'. Nó vẫn giữ nguyên là một ký tự đặc biệt, đó là lý do tại sao phải thay thế thủ công trước khi chuẩn hóa. - Bảo toàn SEO: Giải pháp này chỉ ghi đè slug nếu slug hiện tại đang trống hoặc khớp với giá trị "lỗi" mặc định của CMS. Điều này giúp giữ nguyên các slug mà chuyên gia SEO đã chủ động tùy chỉnh thủ công.
- Hiệu suất: Sử dụng
Regex.IsMatchđể kiểm tra xem chuỗi có chứa ký tự Tiếng Việt hay không trước khi xử lý giúp giảm thiểu chi phí tài nguyên hệ thống.