Mortaza Kamal Nourestani posted here a way to ensure that mobile devices are served at a “m.” subdomain site, and that desktop devices are served at the normal domain.
Here’s my take on that using a resolver in the httprequest pipeline. This only requires adding a class, and .config file with no modifications to existing files. I’ve reused his IsMobileBrowser method.
using System; using System.Linq; using System.Web; using Sitecore.Pipelines.HttpRequest; namespace Samples.Extensions.Resolvers { public class MobileSiteResolver : Sitecore.Pipelines.HttpRequest.SiteResolver { public override void Process(HttpRequestArgs args) { string absoluteUri = String.Format("{0}://{1}{2}", HttpContext.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, HttpContext.Current.Request.RawUrl); string host = HttpContext.Current.Request.Url.Host; if (host.StartsWith("m.")) { if (!IsMobileBrowser(HttpContext.Current)) { host = host.Replace("m.", ""); absoluteUri = absoluteUri.Replace(HttpContext.Current.Request.Url.Host, host); HttpContext.Current.Response.Redirect(absoluteUri); } } else { if (IsMobileBrowser(HttpContext.Current)) { host = String.Format("{0}.{1}", "m", HttpContext.Current.Request.Url.Host); absoluteUri = absoluteUri.Replace(HttpContext.Current.Request.Url.Host, host); HttpContext.Current.Response.Redirect(absoluteUri); } } } public static bool IsMobileBrowser(HttpContext context) { //FIRST TRY BUILT IN ASP.NT CHECK if (context.Request.Browser.IsMobileDevice) { return true; } //THEN TRY CHECKING FOR THE HTTP_X_WAP_PROFILE HEADER if (context.Request.ServerVariables["HTTP_X_WAP_PROFILE"] != null) { return true; } //THEN TRY CHECKING THAT HTTP_ACCEPT EXISTS AND CONTAINS WAP if (context.Request.ServerVariables["HTTP_ACCEPT"] != null && context.Request.ServerVariables["HTTP_ACCEPT"].ToLower().Contains("wap")) { return true; } //AND FINALLY CHECK THE HTTP_USER_AGENT //HEADER VARIABLE FOR ANY ONE OF THE FOLLOWING if (context.Request.ServerVariables["HTTP_USER_AGENT"] != null) { //Create a list of all mobile types string[] mobiles = { "midp", "j2me", "avant", "docomo", "novarra", "palmos", "palmsource", "240x320", "opwv", "chtml", "pda", "windows ce", "mmp/", "blackberry", "mib/", "symbian", "wireless", "nokia", "hand", "mobi", "phone", "cdm", "up.b", "audio", "SIE-", "SEC-", "samsung", "HTC", "mot-", "mitsu", "sagem", "sony" , "alcatel", "lg", "eric", "vx", "NEC", "philips", "mmm", "xx", "panasonic", "sharp", "wap", "sch", "rover", "pocket", "benq", "java", "pt", "pg", "vox", "amoi", "bird", "compal", "kg", "voda", "sany", "kdd", "dbt", "sendo", "sgh", "gradi", "jb", "dddi", "moto", "iphone" }; //Loop through each item in the list created above //and check if the header contains that text if (mobiles.Any(s => context.Request.ServerVariables["HTTP_USER_AGENT"].ToLower().Contains(s.ToLower()))) return true; } return false; } } }
To enable this resolver create a config file in /app_config/includes/ such as mobiledeviceresolver.config with these content:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <httpRequestBegin> <processor patch:before="*[@type='Sitecore.Pipelines.HttpRequest.SiteResolver, Sitecore.Kernel']" type="Samples.Extensions.Resolvers.MobileSiteResolver, Logica.Extensions"/> </httpRequestBegin> </pipelines> </sitecore> </configuration>
The usual caveats apply, this is untested in a production environment, test throughly before using. It could also be significantly optimized for performance.
Recent Comments