📚 Product Knowledge
Multisite Content
📖 Docs

Multisite Content - Optimizely CMS 12

Exam Area: Content Area 1 – Product Knowledge (15%)
Reference: https://docs.developers.optimizely.com/content-management-system/docs/setting-up-multiple-sites


1. Multisite in CMS

Optimizely CMS supports running multiple websites from a single CMS instance, sharing content, blocks, and media.


2. Site Definition

In Code:

// SiteDefinition
public class MySiteDefinition
{
    // Configured in Admin or in code
}

In Admin:


3. Configuring Multiple Sites

// appsettings.json
{
  "EPiServer": {
    "CMS": {
      "Sites": [
        {
          "Name": "Main Site",
          "SiteUrl": "https://example.com",
          "StartPageReference": "5"
        },
        {
          "Name": "Secondary Site",
          "SiteUrl": "https://example.co.uk",
          "StartPageReference": "10"
        }
      ]
    }
  }
}

4. Shared Content Across Sites

Global Assets
├── Global Blocks Folder    → Shared across all sites
└── Global Media Folder     → Shared across all sites

Site 1 (example.com)
├── Start Page (ID: 5)
├── Content...
└── Site Blocks Folder      → Only for site 1

Site 2 (example.co.uk)
├── Start Page (ID: 10)
├── Content...
└── Site Blocks Folder      → Only for site 2

5. Getting Current Site Information

using EPiServer.Web;

// Inject IHttpContextAccessor and ISiteDefinitionRepository
public class MySiteService
{
    private readonly ISiteDefinitionRepository _siteRepo;
    private readonly ISiteDefinitionResolver _siteResolver;

    public SiteDefinition GetCurrentSite()
    {
        return _siteResolver.GetByCurrentContext();
    }

    public SiteDefinition GetByName(string name)
    {
        return _siteRepo.List().FirstOrDefault(s => s.Name == name);
    }
}

6. Cross-Site URL Generation

// Generate an absolute URL (cross-site)
var urlResolver = ServiceLocator.Current.GetInstance<IUrlResolver>();
var absoluteUrl = urlResolver.GetUrl(contentRef, language, 
    new VirtualPathArguments { ForceAbsolute = true });

7. Hostname Routing

Site 1: example.com → Start Page ID 5
Site 2: example.co.uk → Start Page ID 10
Site 3: fr.example.com → Start Page ID 15 (French version)

Wildcard sites:


8. Language per Site

// Each site can be configured with its own languages
var siteDefinition = new SiteDefinition();
siteDefinition.Languages.Add(new SiteLanguage
{
    Language = new CultureInfo("en"),
    IsMasterLanguage = true,
    Url = new Uri("https://example.com/en/")
});
siteDefinition.Languages.Add(new SiteLanguage
{
    Language = new CultureInfo("fr"),
    IsMasterLanguage = false,
    Url = new Uri("https://example.com/fr/")
});

9. Content Sharing Between Sites

// Blocks from the Global folder can be used on any site
var globalBlock = _contentRepository.Get<TeaserBlock>(
    ContentReference.GlobalBlockFolder.ToReferenceWithoutVersion());

// Cross-site link
var crossSiteLink = _urlResolver.GetUrl(contentRef, "en", 
    new VirtualPathArguments { ForceAbsolute = true });

Review Questions

  1. How many sites can a single CMS instance run? (Multiple sites, no limit)
  2. Where are multiple sites configured? (Admin → Config → Websites)
  3. Where are Global Blocks stored? (ContentReference.GlobalBlockFolder)
  4. How do you generate an absolute cross-site URL? (Use IUrlResolver with ForceAbsolute = true)
  5. What can sites share with each other? (Blocks and media from Global folders)