[Sitecore][301 redirect]301リダイレクト
概要:ページずつサイト移行する際のリダイレクトについて。
今回、新しいサイトを構築することになり、ただ、ページずつ作っていくようにと言われました。そのため、もし、サイトコアにてページが作成されていない場合、既存のサイトへリダイレクトをしなければなりません。サイトコアの404についての記事がたくさんあります。404の後、301に設定する記事もあります。私のようなの場合に関しての記事を見かけなかった。ここで自分が思ったことをメモ書きの形で書いていきます。
手始めはサイトのホームーページだけサイトコアへ移行することです。私はすぐに思ったのは404のページを設定すればいいのではと思った。そこで自分に聞くのは今回サイトコアにてホームページだけ移行するのでホームページ以外は全部404になることになります。ですので404の設定だけではだめでした。
客先にどのページは今後サイトコアへ移行するなのかを聞いたところ分からないといわれ、ホームページ以外は既存のサイトへリダイレクトすることと言われました。
まず、考えるのはどんなページがリダイレクトするのかの一覧を作りました。
1.既存サイトはPHPページが多く、PHPページへのリダイレクト
FROM: www.newsandbox.com/contact_us.php&lang=ja&prod=1&trial=1
TO: www.oldsandbox.com/contact_us.php&lang=ja&prod=1&trial=1
最初に思ったのは、これらのPHPページをPHPをカスタム拡張子として対応すると思った。
サイトコアプロセッサでHttpRequestBeginパイプラインにてItemResolverを使用して、サイトコアは、拡張子を考慮せずに、URLからの実際のパスでコンテキストアイテムを決めています。ですので、PHPの拡張子さえ許可すればカスタムコードで対応すればいいかと思った。
しかし、実際に既存のサイトを見ていくと、多くのページがサーバー側の機能を持っています。これらの機能は依然の業者が作成されていたためドキュメントがありません。機能の検証をしながら、こちらへ導入するにはかなり時間がかかります。ですので、すべてのPHPページを既存サイトへリダイレクトすることになった。そうなると、IIS の URL リライト モジュールにてリダイレクトで簡単に対応ができました。
2.サイトコアに存在しないページのリダイレクト
FROM: www.newsandbox.com/not-exist-in-sitecore-page
TO: www.oldsandbox.com/not-exist-in-sitecore-page
みんな知っているように、サイトコアは404の後に302のステータスコードでリダイヤルされるので、カスタム404を行っているのは普通です。ですので、簡単なプロセッサを作って、301のステータスコードで返すようにしました。パイプラインにてプロセッサを追加するに関しての記事が沢山あるので、ここで書きません。パッチをするところとコードだけを見ていきます。
namespace Sandbox.Sitecore.Pipelines { using System; using System.Collections.Generic; using System.Linq; using Sitecore; using System.Web; using Sitecore.Pipelines.HttpRequest; using Sitecore.Configuration; public class ItemNotFoundRedirect : HttpRequestProcessor { public override void Process(HttpRequestArgs args) { var context = HttpContext.Current; try { //サイトコア自身へのアクセルを許可、アドメインページやウェザートページなど。 if (args.LocalPath.StartsWith("/sitecore")) { return; } //サイトコアIgnoreUrlPrefixesにて定義したファイルを無視しましょう。 string rawUrl = HttpContext.Current.Request.RawUrl.ToLower(); var ignorables = Settings.IgnoreUrlPrefixes .Select(x => "/" + x.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).First()) .Distinct(); if (ignorables.Any(x => rawUrl.StartsWith(x))) { return; } string orgUrl = "oldsandbox.com"; const string newUrl = "newsandbox.com"; string requestUrl = args.Context.Request.Url.OriginalString.ToLower(); string requestUrlNoPortNoScheme = args.Context.Request.Url.Authority + args.Context.Request.ApplicationPath.TrimEnd('/'); Uri myUri = new Uri(requestUrl); //コンテンツアイテムが存在しない場合、あるいは、QueryStringが空白でない場合。 //なぜQueryStringを確認をするといいますと、 //例えば古いサイトで: contact_us.php&lang=ja&prod=1&trial=1 とかとあります。 //新しいサイトにすると、お客さんが自然に: contact_us&lang=ja&prod=1&trial=1 と思ったことがります。 //それを対応すべきです。 if (HttpUtility.ParseQueryString(myUri.Query).Count > 0 || Context.Item == null) { string newUrl = args.Context.Request.Url.OriginalString.ToLower().Replace(requestUrlNoPortNoScheme, liveUrl); HttpContext.Current.Response.Redirect(newUrl, false); context.Response.StatusCode = 301; context.Response.End(); } } catch (Exception e) { var t = e; ErrorHandler.LogError(context); } } } }
これをItemAliasResolverの後にパッチすることにしました。
<?xml version="1.0" encoding="utf-8"?> <!--2.2016.0201.1200--> <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <httpRequestBegin> <processor type="Sandbox.Sitecore.Pipelines.HttpRequest.ItemAliasResolver, Sandbox.Sitecore.Pipelines.HttpRequests" patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.ItemAliasResolver, Sitecore.Kernel']" /> </httpRequestBegin> </pipelines> </sitecore> </configuration>