When working with Optimizely CMS 12, URL consistency is crucial for SEO and usability. By default, Optimizely does not enforce lowercase URLs, which can lead to duplicate content issues and inconsistent link structures. In this blog, we’ll explore how to extend UrlResolver to ensure all generated URLs are in lowercase.
Optimizely CMS 12 uses UrlResolver to generate URLs for content items dynamically. While DefaultUrlResolver (the internal default implementation) is responsible for resolving URLs, it is marked as internal, preventing direct inheritance.
Instead, we can wrap IUrlResolver with a custom implementation that intercepts and modifies URLs before returning them.
Solution: Implement a Custom UrlResolver Decorator
We will create a custom implementation of IUrlResolver that wraps the existing UrlResolver and converts all generated URLs to lowercase.
1. Create a Custom UrlResolver Implementation
public class LowercaseUrlResolver : IUrlResolver
{
private readonly IUrlResolver _defaultUrlResolver;
public LowercaseUrlResolver(IUrlResolver defaultUrlResolver)
{
_defaultUrlResolver = defaultUrlResolver;
}
public ContentRouteData Route(UrlBuilder urlBuilder, RouteArguments routeArguments)
{
return _defaultUrlResolver.Route(urlBuilder, routeArguments);
}
public string GetUrl(ContentReference contentLink, string language, UrlResolverArguments urlResolverArguments)
{
var defaultUrl = _defaultUrlResolver.GetUrl(contentLink, language, urlResolverArguments);
return defaultUrl.ToLowerInvariant();
}
public string GetUrl(UrlBuilder urlBuilderWithInternalUrl, UrlResolverArguments arguments)
{
var defaultUrl = _defaultUrlResolver.GetUrl(urlBuilderWithInternalUrl, arguments);
return defaultUrl.ToLowerInvariant();
}
public bool TryToPermanent(string url, out string permanentUrl)
{
return _defaultUrlResolver.TryToPermanent(url, out permanentUrl);
}
}
2. Register the Custom Resolver in Dependency Injection
services.AddSingleton<IUrlResolver>(sp =>
{
var originalResolver = sp.GetRequiredService<UrlResolver>();
return new LowercaseUrlResolver(originalResolver);
});
By wrapping IUrlResolver and modifying its behavior, we enforce lowercase URLs across all Optimizely CMS 12-generated links. This approach maintains flexibility while ensuring consistent, SEO-friendly URLs.
Would you like to extend this further, such as handling query parameters or fragments? Let us know in the comments!