Bạn đang gặp vấn đề với lỗi 404 khi truy cập các trang đa ngôn ngữ trên Sitecore SXA? Bài viết này sẽ cung cấp cho bạn các giải pháp từng bước để khắc phục tình trạng này, đảm bảo người dùng luôn được điều hướng đến nội dung phù hợp, bất kể ngôn ngữ họ chọn. Chúng ta sẽ khám phá các phương pháp từ cấu hình đơn giản đến tùy chỉnh chuyên sâu, giúp bạn xây dựng một trang web đa ngôn ngữ mượt mà và thân thiện với người dùng.
Trong một trang web đa ngôn ngữ sử dụng Sitecore SXA, việc điều hướng bằng URL có thể dẫn đến lỗi 404 nếu URL chứa mã ngôn ngữ không hợp lệ hoặc không tồn tại. Ví dụ, nếu trang web hỗ trợ tiếng Anh (en) và tiếng Pháp (fr), việc truy cập URL `/de/product` (tiếng Đức) có thể gây ra lỗi 404. Nguyên nhân chính là do Sitecore không thể tìm thấy nội dung tương ứng với mã ngôn ngữ "de".
Một tình huống khác xảy ra khi **tên item sản phẩm** khác nhau giữa các ngôn ngữ. Nếu sản phẩm có tên "Product" trong tiếng Anh nhưng được dịch thành "Produits" trong tiếng Pháp, việc truy cập `/fr/product` sẽ dẫn đến lỗi 404 vì Sitecore tìm kiếm item có tên "product" trong ngữ cảnh tiếng Pháp, nhưng không tìm thấy. Bài viết này sẽ hướng dẫn cách giải quyết triệt để các vấn đề trên.
Đảm bảo rằng bạn đã kích hoạt trường "Language Embedding" trong item Site Grouping. Thao tác này cho phép Sitecore tự động nhúng thông tin ngôn ngữ vào URL. Để thực hiện, hãy điều hướng đến `/sitecore/content/TENANT/YOURSITEfolder/YOURSITE/Settings/Site Grouping` và kiểm tra cài đặt "Language Embedding". Cài đặt này cho phép bạn kiểm soát cách ngôn ngữ được thể hiện trên URL của bạn.
Nếu bạn muốn Sitecore phân giải item dựa trên Display Name thay vì Item Name, hãy sử dụng thuộc tính `useDisplayName` trong LinkManager. Để thực hiện, hãy tạo một file cấu hình patch như sau:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<linkManager>
<providers>
<localizedProvider>
<patch:attribute name="useDisplayName">true</patch:attribute>
</localizedProvider>
</providers>
</linkManager>
</sitecore>
</configuration>
Cấu hình này sẽ hướng dẫn Sitecore sử dụng **Display Name** khi tạo URL, giúp giải quyết vấn đề khi tên item khác nhau giữa các ngôn ngữ. Điều này đặc biệt hữu ích khi bạn muốn người dùng thấy URL thân thiện hơn và dễ đọc hơn.
Giải pháp tùy chỉnh này cho phép bạn kiểm soát hoàn toàn quá trình phân giải item dựa trên URL. Bạn có thể tạo một `HttpRequestProcessor` để trích xuất ngôn ngữ và **tên hiển thị** từ URL, sau đó tìm kiếm item tương ứng trong Sitecore.
Dưới đây là một ví dụ cơ bản về cách triển khai `CustomItemResolver`:
using Sitecore;
using Sitecore.Configuration;
using Sitecore.Diagnostics;
using Sitecore.Pipelines.HttpRequest;
using Sitecore.Sites;
using Sitecore.Web;
public class CustomItemResolver : HttpRequestProcessor
{
public override void Process(HttpRequestArgs args)
{
if (Context.Site == null)
{
return;
}
SiteContext siteContext = Context.Site;
if (siteContext != null && siteContext.DisplayMode == DisplayMode.Normal)
{
string requestedUrl = args.Url.ItemPath;
string languageName = ExtractLanguageFromUrl(requestedUrl);
if (!string.IsNullOrEmpty(languageName))
{
Language language = Language.Parse(languageName);
Context.Language = language;
string displayName = ExtractDisplayNameFromUrl(requestedUrl);
Item item = Sitecore.Context.Database.GetItem(siteContext.RootPath + "/" + displayName);
if (item == null)
{
args.AbortPipeline();
HttpContext.Current.Response.Redirect("/404");
return;
}
Context.Item = item;
}
}
}
private string ExtractLanguageFromUrl(string url)
{
// Implement logic to extract language from URL, e.g., parse the URL path
return "en"; // Example: Return "en" for English
}
private string ExtractDisplayNameFromUrl(string url)
{
// Implement logic to extract display name from URL, e.g., parse the URL path
return "home"; // Example: Return "home" as the display name
}
}
**Lưu ý quan trọng:** Bạn cần triển khai các phương thức `ExtractLanguageFromUrl` và `ExtractDisplayNameFromUrl` để phù hợp với cấu trúc URL của bạn. Sau đó, hãy patch processor này vào pipeline `httpRequestBegin` trong file cấu hình Sitecore.
Đảm bảo rằng bạn có một trang 404 tùy chỉnh cho từng ngôn ngữ. Khi người dùng truy cập một trang không tồn tại trong ngôn ngữ hiện tại, hãy chuyển hướng họ đến trang 404 tương ứng. Điều này mang lại trải nghiệm người dùng tốt hơn so với việc chỉ hiển thị một trang lỗi chung chung.
Để thực hiện điều này, bạn có thể sử dụng pipeline `httpRequestBegin` để kiểm tra xem item có tồn tại trong ngôn ngữ hiện tại hay không. Nếu không, hãy đặt `Context.Item` thành trang 404 của ngôn ngữ đó và đặt mã trạng thái HTTP thành 404.
Việc xử lý lỗi 404 đa ngôn ngữ trong Sitecore SXA đòi hỏi sự kết hợp giữa cấu hình và tùy chỉnh. Bằng cách kích hoạt "Language Embedding", sử dụng `useDisplayName` và xây dựng `CustomItemResolver`, bạn có thể đảm bảo rằng trang web của bạn cung cấp trải nghiệm người dùng mượt mà và chính xác, bất kể ngôn ngữ mà người dùng lựa chọn. Hãy nhớ kiểm tra và thử nghiệm các giải pháp này để tìm ra phương pháp phù hợp nhất với nhu cầu cụ thể của dự án của bạn. Chúc bạn thành công trong việc xây dựng một trang web đa ngôn ngữ hoàn hảo với Sitecore SXA!
Bài viết liên quan