CMS & Content Platforms

Xử lý lỗi URL Slug Tiếng Việt trong Optimizely CMS 12

By Ginbok3 min read

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ố

#optimizely#seo#backend#cms13
← Back to Articles
Xử lý lỗi URL Slug Tiếng Việt trong Optimizely CMS 12 - Ginbok