[Sitecore][IP Geolocation][Redirect] Sitecore IPジオロケーションをもとにユーザーリダイレクト
概要:
Sitecore IPジオロケーションサービスを使って、国別にユーザを自動的にリダイレクトする
に関するメモ書きです。
もしSitecore IPジオロケーションサービスを使用しているであれば、ユーザの国コードが知ることができますので、それをもとに自動的にリダイレクトします。
国のコードを取得後、リダイレクトするのは簡単ですが、ただ、いくつかの状況を事前考慮しなければなりません。
■USのユーザが日本へ出張し、現地でUSのサイトへアクセスをすると、ジオロケーションにて日本として判断され、常に日本のサイトへリダイレクトしてしまいます。USのユーザですので日本にいながら、USのサイトへアクセスしたい。
■USのユーザがVPNや、RDPでUS以外のサーバーへ接続し、サイトへアクセスすると、ジオロケーションが外国と判定し、US以外のサイトへリダイレクしてしまいます。USのユーザですので日本にいながら、USのサイトへアクセスしたい。
■サイトのサブページへアクセスする際にも国コードをもとにダイレクトされるどうかの判断があり、ユーザーを混乱されないように考慮しなければなりません。
上記の状況を対応するにはなんらかの方法でユーザーにどの国のサイトにてブラウズするという確認を取ることが必要です。よく見かけるのはポップアップウィンドにて、ユーザーが特定の国のサイトにてブラウズするかどうかの確認をとり、
確認を取った時点でクッキーを設定し、ブラウザーが閉じるまで常にこのクッキーを確認し、必要のないリダイレクトを避けます。また、ヘッダーやフッターにある国別のリンクを利用し、クッキーを設定することも見かけます。
例えば、メインのサイトがUSサイトであり、日本のユーザーがUSサイトへアクセスすると、ジオロケーションが日本の国コードが判定され、ユーザを日本のサイトへリダイレクトします。
if (Tracker.Current != null && Tracker.Current.Interaction != null && Tracker.Current.Interaction.GeoData != null && !string.IsNullOrEmpty(Tracker.Current.Interaction.GeoData.Country) && Tracker.Current.Interaction.GeoData.Country == "JP" ) { //日本のサイトへリダイレクトします。 HttpContext.Current.Response.Redirect( HttpContext.Current.Request.Url.AbsoluteUri.Replace( HttpContext.Current.Request.Url.Host, sgWebUrl)); }
一度USのサイトへリダイレクトされたユーザーがヘッダーやフッターにある国別のリンクをクリックします。例えば、
”US サイト” のリンクをクリックします。この時点でクッキーを設定します。もし国別のドメインが違う場合、別の
国のドメインを設定できない場合は、UrlReferrerを確認し、クッキーを設定することができます。
if (HttpContext.Current.Request.UrlReferrer != null && (HttpContext.Current.Request.UrlReferrer.Host.ToLower().Contains("sanbox.jp")) { SetCookie("usVisitOverride", "true"); } /// <summary> /// クッキーを設定 /// </summary> /// <param name="strKey">クッキー名</param> /// <param name="strValue">クッキー値</param> private void SetCookie(string strKey, string strValue) { if (string.IsNullOrEmpty(strKey)) { return; } strKey = string.Format("{0}", strKey.ToUpper()); var context = HttpContext.Current; var cookie = context.Request.Cookies[strKey]; if (cookie != null) { cookie.Value = strValue; } else { cookie = new HttpCookie(strKey); } cookie.Domain = GetCookieDomain(); cookie.Value = strValue; context.Response.SetCookie(cookie); //cookie.Expiresを設定せず、ブラウザーが閉じる際に無効になります。 }
リダイレクトのコードにて、常にこのクッキーを確認します。もし、このクッキーが設定されている場合はリダイレクトしない。
/// <summary> /// クッキーの設定を取得 /// </summary> /// <returns> /// <c>true</c> if [is user prefer us site]; otherwise, <c>false</c>. /// </returns> private bool IsUserPreferUsSite() { var context = HttpContext.Current; var cookie = context.Request.Cookies["usVisitOverride"]; if (cookie != null && cookie.Value.Equals("true")) { return true; } return false; }
さて、コードを見てみましょう。
namespace Sandbox.Pipelines.HttpRequest { public class IpGeoCountryBasedRedirect : HttpRequestProcessor { public override void Process(HttpRequestArgs args) { //設定を有効にされているかどうかを確認にします。 //もし問題が発生時、設定にて無効にすることができます。 if (!Settings.GetBoolSetting("IpGeoCountryBasedRedirect.Enabled", false)) { return; } if (Context.Site == null) { return; } //無視されいてるURLの場合はリダイレクトしない 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; } //サイトコアのレイアウトやAPIのリクエストの場合はリダイレクトしない if (rawUrl.StartsWith("/layouts/system/")) { return; } if (rawUrl.StartsWith("/api/sitecore/")) { return; } //リダイレクトはUSサイトへのリクエストのみ処理する。 //例えば、ユーザーが直接sandbox.jpへリクエストする場合はリダイレクト処理しません。 if (Context.Site.Name.ToLower().Contains("sandboxus")) { //USサイトからのリクエストの場合はユーザーがUSさいとにてブラウズしたいこと // としてクッキーを設定 if (HttpContext.Current.Request.UrlReferrer != null && HttpContext.Current.Request.UrlReferrer.Host.ToLower().Contains("sanbox.jp")) { SetCookie("usVisitOverride", "true"); } if (Tracker.Current != null && Tracker.Current.Interaction != null && Tracker.Current.Interaction.GeoData != null && !string.IsNullOrEmpty(Tracker.Current.Interaction.GeoData.Country) && Tracker.Current.Interaction.GeoData.Country == "JP" && !IsUserPreferUsSite())) { //日本のサイトへリダイレクトします。 HttpContext.Current.Response.Redirect( HttpContext.Current.Request.Url.AbsoluteUri.Replace( HttpContext.Current.Request.Url.Host, sgWebUrl)); } } } }
最後に、<httpRequestEnd>にてプロセスをパッチすればいい。
ローカルで動作確認する際に Sitecore Analytics Testing Tools を使うのをお勧めします。
簡単にさまざまな国のIPを追加して、IPに基づいてロケーションページがどのように変化するかを確認できます。