public override string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias)
        {
            var currentStore = HccRequestContext.Current.CurrentStore;

            if (currentStore != null)
            {
                if (tab != null)
                {
                    var urlConfig = new UrlConfigSettings();

                    var locales = Factory.Instance.CreateStoreSettingsProvider().GetLocales();
                    foreach (var local in locales)
                    {
                        var context         = new HccRequestContext(local.Code);
                        var accountServices = Factory.CreateService <AccountService>(context);
                        var store           = accountServices.Stores.FindByIdWithCache(currentStore.Id);
                        urlConfig = store.Settings.Urls.UrlConfigs
                                    .FirstOrDefault(uc => uc.TabId == tab.TabID);

                        if (urlConfig != null)
                        {
                            break;
                        }
                    }

                    if (urlConfig != null && !string.IsNullOrEmpty(urlConfig.CustomUrl))
                    {
                        var queryStringDic = GetQueryStringDictionary(path);
                        var friendlyPath   = GetFriendlyAlias(path, portalAlias, true);

                        return(GetFriendlyQueryString(tab, friendlyPath, pageName, urlConfig));
                    }
                }
            }

            return(base.FriendlyUrl(tab, path, pageName, portalAlias));
        }
        private string GetFriendlyQueryString(TabInfo tab, string path, string pageName, UrlConfigSettings urlConfig)
        {
            var friendlyPath            = path;
            var queryStringMatch        = Regex.Match(friendlyPath, "(.[^\\\\?]*)\\\\?(.*)", RegexOptions.IgnoreCase);
            var queryStringSpecialChars = "";

            if (!ReferenceEquals(queryStringMatch, Match.Empty))
            {
                friendlyPath = queryStringMatch.Groups[1].Value;
                var queryStringDic = GetQueryStringDictionary(path);


                var customUrl = string.Empty;
                if (urlConfig != null)
                {
                    customUrl = urlConfig.CustomUrl;
                }
                var replacePath = string.Empty;
                if (!string.IsNullOrEmpty(customUrl))
                {
                    replacePath = customUrl.TrimStart('/');
                }

                if (queryStringDic.ContainsKey("slug"))
                {
                    replacePath = replacePath + "/" + HttpContext.Current.Server.UrlDecode(queryStringDic["slug"]);
                }

                friendlyPath = Regex.Replace(friendlyPath, Globals.glbDefaultPage, replacePath, RegexOptions.IgnoreCase);

                var queryString = queryStringMatch.Groups[2].Value.Replace("&amp;", "&");
                if (queryString.StartsWith("?"))
                {
                    queryString = queryString.TrimStart(Convert.ToChar("?"));
                }
                var nameValuePairs = queryString.Split(Convert.ToChar("&"));
                for (var i = 0; i <= nameValuePairs.Length - 1; i++)
                {
                    var pair = nameValuePairs[i].Split(Convert.ToChar("="));

                    if (pair[0] == "slug" || pair[0] == "tabid")
                    {
                        continue;
                    }

                    //Rewrite into URL, contains only alphanumeric and the % or space
                    if (string.IsNullOrEmpty(queryStringSpecialChars))
                    {
                        queryStringSpecialChars = pair[0] + "=" + pair[1];
                    }
                    else
                    {
                        queryStringSpecialChars = queryStringSpecialChars + "&" + pair[0] + "=" +
                                                  HttpContext.Current.Server.UrlDecode(pair[1]);
                    }
                }
            }
            if (!string.IsNullOrEmpty(queryStringSpecialChars))
            {
                return(friendlyPath + "?" + queryStringSpecialChars);
            }
            return(friendlyPath);
        }