05 November, 2013

Sitecore Analytics: DMS 2.0: Persistent Cookies

Sitecore Analytics provides most accurate data as it works on server side. It has lot of tracking variables which can used for analysis.
As part of Sitecore Analytics, certain cookies are set in the web client.


SC_ANALYTICS_GLOBAL_COOKIE: To identify repeat visits from a single user, Sitecore sends a persistent session cookie to the web client. The name of the persistent session cookie is SC_ANALYTICS_GLOBAL_COOKIE. The persistent session cookie expires 10 years after the last page requested from the solution by the web client.

SC_ANALYTICS_SESSION_COOKIE: To identify a sequence of HTTP requests from a single user, Sitecore sends an Engagement Analytics session cookie to the web client. The name of the session cookie is SC_ANALYTICS_SESSION_COOKIE. One of key feature of Sitecore Analytics Session Cookie is though ASP.NET expires (normally due the sessionState configuration) and creates a new session in the web page, Analytics session will not expire and will not create a new visit. 

AFAIK, this expiration time cannot be changed.

In Sitecore.Analytics.dll (DMS 2.0), the below code snippets add cookies to the client. Expiration time for Global session is for 10 years. 

HttpCookie result = (current == null) ? null : current.Response.Cookies["SC_ANALYTICS_GLOBAL_COOKIE"];
if (result == null)
       result = new HttpCookie("SC_ANALYTICS_GLOBAL_COOKIE");
result.Value = this.VisitorId.ToString("N");
result.Path = "/";
result.Expires = this.IsInvalid ? DateTime.UtcNow.AddDays(-1.0) : DateTime.UtcNow.AddYears(10);

In the client, 

Set-Cookie: SC_ANALYTICS_GLOBAL_COOKIE=f80224a049a94a23a6a66c5c81639e13; expires=Mon, 01-Nov-2023 20:02:52 GMT; path=/; HttpOnly
Set-Cookie: SC_ANALYTICS_SESSION_COOKIE=BEAC5C6ADBE44D9E84056B4A8C019C46|1|3i11wfogrb2aqp1h2oj5cpwr; path=/; HttpOnly

04 November, 2013

Sitecore: Default Pages showing the home page

Default pages in Sitecore renders home page of the site.

Though there is no Sitecore item with name default, the above links still render the 
StartPath. Ideally this should redirect to 404 error page.

Sitecore DefaultResolver Pipeline checks for this default document and if the request is with the default document, then it set the current context item as the Site StartPath item and we get the StartPath for all the above URLs.


SiteContext site = Context.Site;
if ((((Context.Item == null) && (Context.Database != null)) && ((site != null) && (site.StartPath.Length != 0))) && ((args.LocalPath.Length == 0) || (args.LocalPath == "/default")))
    Item item = args.GetItem(site.StartPath);
    if (item != null)
        Tracer.Info("Using default item \"" + site.StartPath + "\" from site definition.");
        Context.Item = item;
    else if (!args.PermissionDenied)
        Tracer.Error("Default item was not found: " + site.StartPath, "Database: \"" + Context.Database.Name + "\"");

To avoid this, create a custom DefaultResolver pipeline and remove the condition for the default document.
if ((((Context.Item == null) && (Context.Database != null)) && ((site != null) && (site.StartPath.Length != 0))) && ((args.LocalPath.Length == 0)

This will throw 404 error for all the default URLs.

blockquote { margin: 0; } blockquote p { padding: 15px; background: #eee; border-radius: 5px; } blockquote p::before { content: '\201C'; } blockquote p::after { content: '\201D'; }