重定向Sitecore解决方案Noob

时间:2014-08-18 07:46:55

标签: c# regex redirect sitecore sitecore7

这里我想要做的是,我的雇主希望能够使用正则表达式重新定位301重定向与Sitecore中的别名,所以我试图实现它的方式是这样的!

单行文字字段 用一个复选框告诉sitecore它将是一个正则表达式我是.NET中的菜鸟和Sitecore如何实现这个?这里有一个例子http://postimg.org/image/lwr524hkn/

我需要帮助重定向的例子我想要处理是这样的,这是我想做的重定向的例子它可能是解决方案的产品。

exemple.com/en/solution/platform-features to

exemple.com/en/platform-features

我基于http://www.cmssource.co.uk/blog/2011/December/modifying-sitecore-alias-to-append-custom-query-strings-via-301-redirect的代码,这是用于查询字符串,我想使用正则表达式。

    namespace helloworld.Website.SC.Common
{
    public class AliasResolver : Sitecore.Pipelines.HttpRequest.AliasResolver
    {
        // Beginning of the Methods
        public new void Process(HttpRequestArgs args)
        {
            Assert.ArgumentNotNull(args, "args");

            if (!Settings.AliasesActive)
            {
                Tracer.Warning("Aliases in AliasResolver are not active.");
            }
            else
            {
                Sitecore.Data.Database database = Context.Database;
                if (database == null)
                {
                    Tracer.Warning("There is no context in the AliasResolver.");
                }
                else
                { 


                    {
                        Profiler.StartOperation("Resolve virgin alias pipeline.");
                        Item item = ItemManager.GetItem(FileUtil.MakePath("/sitecore/system/aliases", args.LocalPath, '/'), Language.Current, Sitecore.Data.Version.First, database, SecurityCheck.Disable);
                        if (item != null)
                        {
                            //Alias existis (now we have the alias item)
                            if (item.Fields["Regular Expressions"] != null)
                            {
                                if (!String.IsNullOrEmpty(item.Fields["Regular Expressions"].Value) && !args.Url.QueryString.Contains("aproc"))
                                {
                                   var reg = new Regex(@"(?<Begin>([^/]*/){2})[^/]*/(?<End>.*)");
                                   var match = reg.Match(@"exemple.com/en/solution/platform-features");
                                   var result = match.Groups["Begin"].Value + match.Groups["End"].Value;
                                }
                            }
                        }
                        Profiler.EndOperation();
                    }
                    catch (Exception ex)
                    {
                        Log.Error("Had a problem in the VirginAliasResolver. Error: " + ex.Message, this);
                    }
                }
            }
        }
        ///<summary>
        ///  Once a match is found and we have a Sitecore Item, we can send the 301 response.
        ///</summary>
        private static void SendResponse(string redirectToUrl, HttpRequestArgs args)
        {
            args.Context.Response.Status = "301 Moved Permanently";
            args.Context.Response.StatusCode = 301;
            args.Context.Response.AddHeader("Location", redirectToUrl);
            args.Context.Response.End();
        }
    }
}
PS:我知道他们有这方面的模块,但我的雇主希望这样做,我正在寻求帮助,因为我已经有一周时间试图添加此功能

1 个答案:

答案 0 :(得分:-1)

因此,如果我理解正确,您不希望按路径选择别名:

Item item = ItemManager.GetItem(FileUtil.MakePath("/sitecore/system/aliases", args.LocalPath, '/'), Language.Current, Sitecore.Data.Version.First, database, SecurityCheck.Disable);

而是找到一个Alias,将Regex字段与Url进行比较。我没有测试过这个,但它可能有点像:

var originalUrl = HttpContext.Current.Request.Url;
var allAliases = Sitecore.Context.Database.SelectItems("/sitecore/system/aliases//*");
var foundAlias = allAliases.FirstOrDefault( alias =>
                        !string.IsNullOrEmpty(alias["Regular Expressions"]) &&
                        Regex.IsMatch(HttpContext.Current.Request.Url.ToString(), alias["Regular Expressions"]));

然后,如果foundAlias!= null,您可以像在私人SendResponse函数中一样检索网址和重定向。

var linkField = (LinkField)foundAlias.Fields["linked item"];
var targetUrl = linkField.Url;
using (new SecurityDisabler()) 
{
    if (string.IsNullOrEmpty(targetUrl) && linkField.TargetItem != null)
       targetUrl = LinkManager.GetItemUrl(linkField.TargetItem);
}

SendResponse(targetUrl, args);

同样,我没有对此进行过测试,所以如果需要进行一些修正,请不要开枪,但这应该可以帮助你顺利完成。