Exam Area: Content Area 1 – Product Knowledge (15%)
Reference: https://docs.developers.optimizely.com/content-management-system/docs/setting-up-multiple-sites
Optimizely CMS supports running multiple websites from a single CMS instance, sharing content, blocks, and media.
// SiteDefinition
public class MySiteDefinition
{
// Configured in Admin or in code
}
// appsettings.json
{
"EPiServer": {
"CMS": {
"Sites": [
{
"Name": "Main Site",
"SiteUrl": "https://example.com",
"StartPageReference": "5"
},
{
"Name": "Secondary Site",
"SiteUrl": "https://example.co.uk",
"StartPageReference": "10"
}
]
}
}
}
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
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);
}
}
// Generate an absolute URL (cross-site)
var urlResolver = ServiceLocator.Current.GetInstance<IUrlResolver>();
var absoluteUrl = urlResolver.GetUrl(contentRef, language,
new VirtualPathArguments { ForceAbsolute = true });
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)
*.example.com// 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/")
});
// 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 });
ContentReference.GlobalBlockFolder)IUrlResolver with ForceAbsolute = true)