In previous posts I referred to a utility method GetPublicationUrl. This method simply looks up the current request path and returns the first two levels under the root. In my current implementation it is these two levels that identify the Publication.
For example, for URL path /zh/cn/products/abc.html, method GetPublicationUrl returns "/zh/ch/".
In different implementations, it could be that only the first level of the URL path represents the Publication URL, but that is a matter of choice and URL design.
The code below show casts the simple GetPublicationUrl method, which applies a regular expression pattern to the given (current) URL path. The regular expression pattern matches only if the path starts with slash and is followed by two characters, followed by slash, followed by two characters, followed by slash. In this case, it extracts the 2 level nested folders and returns them.
Why would such a method be helpful? The reason to use such method is support for multiple website. In Tridion, we represent different websites as different Publications and each Publication is identified by an ID and a URL root. If we know, or if we are able to read this Publication URL, then all our pages become relative to this Publication URL. This makes is very easy to just reuse the same application code in order to serve many different websites (or locales). In my current implementation I used GetPublicationUrl with Navigation, Labels, or simply loading any kind of resource that is configurable in a central repository, and I don't need to worry about which repository or context the resource is defined in.
However, this method only resolves half way a Publication URL. In fact, it doesn't actually do any resolving. It simply provides a context for a given general URL. A proper Publication Resolver would provide mappings between Publication ID and Publication URL and vice versa. But more information about a proper Publication Resolver is available in post Dynamic Publication Resolver.
For example, for URL path /zh/cn/products/abc.html, method GetPublicationUrl returns "/zh/ch/".
In different implementations, it could be that only the first level of the URL path represents the Publication URL, but that is a matter of choice and URL design.
The code below show casts the simple GetPublicationUrl method, which applies a regular expression pattern to the given (current) URL path. The regular expression pattern matches only if the path starts with slash and is followed by two characters, followed by slash, followed by two characters, followed by slash. In this case, it extracts the 2 level nested folders and returns them.
public static class UriHelper { private static readonly Regex PublicationUrlRegex = new Regex("^(/../../).*"); public static string GetPublicationUrl(string urlPath) { string result = "/"; Match match = PublicationUrlRegex.Match(urlPath); if (match.Success) { result = match.Groups[1].Value; } return result; } public static string GetPublicationUrl(HttpContextBase httpContext) { return GetPublicationUrl(httpContext.Request.Path); } public static string GetPublicationUrl(HttpContext httpContext) { return GetPublicationUrl(httpContext.Request.Path); } }
Why would such a method be helpful? The reason to use such method is support for multiple website. In Tridion, we represent different websites as different Publications and each Publication is identified by an ID and a URL root. If we know, or if we are able to read this Publication URL, then all our pages become relative to this Publication URL. This makes is very easy to just reuse the same application code in order to serve many different websites (or locales). In my current implementation I used GetPublicationUrl with Navigation, Labels, or simply loading any kind of resource that is configurable in a central repository, and I don't need to worry about which repository or context the resource is defined in.
However, this method only resolves half way a Publication URL. In fact, it doesn't actually do any resolving. It simply provides a context for a given general URL. A proper Publication Resolver would provide mappings between Publication ID and Publication URL and vice versa. But more information about a proper Publication Resolver is available in post Dynamic Publication Resolver.
Comments