Guide complet pour activer le module complémentaire Headless Multisite pour votre solution XM Cloud / Blogs / Perficient

Le SDK Sitecore Headless Next.Js a récemment apporté la fonctionnalité qui permet d’avoir plusieurs sites Web de l’arborescence de contenu Sitecore servis par la même application JSS de levage de rendu. Il utilise Intergiciel Next.js pour servir le bon site Sitecore en fonction du nom d’hôte entrant.
Pourquoi et quand utiliser le module complémentaire multisite
Le module complémentaire Multisite est particulièrement utile dans les scénarios où plusieurs sites partagent des composants communs ou lorsqu’il est nécessaire de centraliser la logique de rendu. Il simplifie les pipelines de déploiement et réduit la complexité de l’infrastructure, ce qui le rend idéal pour les entreprises gérant un portefeuille de sites Web sous une architecture unifiée. Cette approche permet d’économiser des ressources et garantit une expérience utilisateur cohérente sur tous les sites.
Comment ça marche
L’application récupère les informations du site au moment de la constructionpas au moment de l’exécution (pour des raisons de performances). Chaque demande invoque tous Intergiciel Next.js. Étant donné que les ajouts de nouveaux sites ne sont PAS fréquents, la récupération des informations sur le site au moment de l’exécution (bien que techniquement possible) n’est pas la meilleure solution en raison de son impact potentiel sur les performances des visiteurs. Vous pouvez automatiser ce processus utiliser un webhook pour déclencher les redéploiements automatiques de votre application Next.js lors de la publication.
Sitecore fournit un schéma relativement compliqué de son fonctionnement (photo ci-dessous), mais si vous ne comprenez pas dès le premier coup d’œil, ne vous inquiétez pas, vous comprendrez après avoir lu cet article.
Mise en œuvre technique
Il y a quelques étapes à suivre pour que cela fonctionne. Commençons par l’environnement local.
Puisque le multisite fait référence à différents sites, nous devons configurer les noms d’hôtes. Le Principal le site fonctionne sur main.localhost
nom d’hôte, et il est déjà configuré comme ci-dessous :
.\.env RENDERING_HOST=main.localhost .\docker-compose.override.yml PUBLIC_URL: "https://${RENDERING_HOST}"
Dans le cadre de l’expérimentation, nous prévoyons de créer un deuxième site Internet desservi par second.localhost
localement. Pour ce faire, ajoutons une nouvelle variable d’environnement à la racine .env
déposer (SECOND_HOST=second.localhost
) et introduire quelques modifications à init.ps1
scénario:
$renderingHost = $envContent | Where-Object { $_ -imatch "^RENDERING_HOST=.+" } $secondHost = $envContent | Where-Object { $_ -imatch "^SECOND_HOST=.+" } $renderingHost = $renderingHost.Split("=")[1] $secondHost = $secondHost .Split("=")[1]
en bas du fichier, nous souhaitons également créer un certificat SSL pour ce domaine en ajoutant une ligne en bas :
& $mkcert -install # & $mkcert "*.localhost" & $mkcert "$xmCloudHost" & $mkcert "$renderingHost" & $mkcert "$secondHost"
Pour que Traefic récupère le certificat généré et achemine le trafic selon les besoins, nous devons ajouter deux lignes supplémentaires à la fin de .\docker\traefik\config\dynamic\certs_config.yaml
déposer:
tls: certificates: - certFile: C:\etc\traefik\certs\xmcloudcm.localhost.pem keyFile: C:\etc\traefik\certs\xmcloudcm.localhost-key.pem - certFile: C:\etc\traefik\certs\main.localhost.pem keyFile: C:\etc\traefik\certs\main.localhost-key.pem - certFile: C:\etc\traefik\certs\second.localhost.pem keyFile: C:\etc\traefik\certs\second.localhost-key.pem
Si vous essayez d’initialiser et d’exécuter, cela peut sembler fonctionner à première vue. Mais naviguer vers second.localhost
dans le navigateur entraînera une boucle de redirection infinie. En inspectant la cause, j’ai réalisé que cela se produisait en raison d’un problème CORS, à savoir que second.localhost
n’a pas CORS configuré. Généralement, lors de la configuration de l’hôte de rendu à partir de docker-compose.override.yml
nous fournissons PUBLIC_URL
variable d’environnement dans le conteneur hôte de rendu, cependant, il s’agit d’une valeur unique et nous ne pouvons pas en transmettre plusieurs.
Voici le plus descriptif Article StackOverflow J’ai créé pour résoudre un problème donné
Pour le résoudre, nous devons fournir le deuxième hôte dans la syntaxe ci-dessous ainsi que définir les règles CORS comme étiquettes dans l’hôte de rendu, comme ci-dessous :
labels: - "traefik.enable=true" - "traefik.http.routers.rendering-secure.entrypoints=websecure" - "traefik.http.routers.rendering-secure.rule=Host(`${RENDERING_HOST}`,`${SECOND_HOST}`)" - "traefik.http.routers.rendering-secure.tls=true" # Add CORS headers to fix CORS issues in Experience Editor with Next.js 12.2 and newer - "traefik.http.middlewares.rendering-headers.headers.accesscontrolallowmethods=GET,POST,OPTIONS" - "traefik.http.middlewares.rendering-headers.headers.accesscontrolalloworiginlist=https://${CM_HOST}, https://${SECOND_HOST}" - "traefik.http.routers.rendering-secure.middlewares=rendering-headers"
Une fois ce qui précède effectué, vous pouvez exécuter l’invite PowerShell, initialiser et lancer les conteneurs Sitecore, comme d’habitude, en exécutant les scripts init.ps1 et up.ps1.
Configuration de Sitecore
Attendez que Sitecore démarre, accédez à une collection de sites, cliquez dessus avec le bouton droit et ajoutez un autre site Web l’appelant Second s’exécutant sur un nom d’hôte second.localhost.
S’assurer deuxième le site utilise exactement le même nom d’application que principalvous pouvez configurer cela à partir de /sitecore/content/Site Collection/Second/Settings
article, Nom de l’application champ. Cela garantit que le but de cet exercice est que les deux sites réutilisent la même application hôte de rendu.
Vous devez également vous assurer que les valeurs de Hôte de rendu d’application prédéfini domaines de /sitecore/content/Site Collection/Second/Settings/Site Grouping/Second
et /sitecore/content/Site Collection/Main/Settings/Site Grouping/Main
articles.
Un autre domaine important ici est Nom d’hôteassurez-vous de définir ces champs pour les deux sites Web :
Maintenant vous êtes prêt à éditer Maison article de Deuxième site. Le middleware multisite n’affecte pas le mode d’édition de Sitecore, donc à partir de là, vous ne verrez aucune différence.
Dépannage
Si vous avez tout fait correctement, mais second.localhost
résout le site Web principal, résolvons les problèmes. Le tout premier endroit à vérifier est .\src\rrh\src\temp\config.js
déposer. Ce fichier contient la variable sites avec le tableau de sites et les noms d’hôtes associés à utiliser pour la résolution du site. Le fait important est qu’un fichier donné est généré au moment de la constructionpas le temps d’exécution.
Donc, vous l’ouvrez et voyez un tableau vide (config.sites = process.env.SITES || '[]'
), cela signifie qu’il vous suffit d’initialiser la build, par exemple en supprimant et en recréant simplement le conteneur hôte de rendu :
docker-compose kill rendering docker-compose rm rendering -f docker-compose up rendering -d
De plus, avant d’exécuter ce qui précède, il est utile de vérifier Responsable du site SXAqui est disponible dans la boîte à outils PowerShell dans Sitecore Desktop. Vous devez y voir les sites et les noms d’hôtes pertinents et dans le bon ordre – assurez-vous de les déplacer le plus haut possible, car cette chaîne de sites fonctionne selon le principe « premier arrivé – premier servi ».
Après le rendu, l’hôte est recréé (cela peut prendre un certain temps pour les étapes de construction et de démarrage), vérifiez la définition du site sur .\src\rrh\src\temp\config.js
encore. Cela devrait ressembler à ci-dessous :
config.sites = process.env.SITES || '[{"name":"second","hostName":"second.localhost","language":""},{"name":"main","hostName":"main.localhost","language":""}]'
Le nombre d’enregistrements du site client SXA doit correspondre aux enregistrements de SXA Site Manager. Maintenant, l’exécution de second.localhost dans le navigateur devrait afficher la page d’accueil rendue du deuxième site.
Une autre technique de dépannage consiste à inspecter les journaux du middleware. Pour ce faire, créez .env.local
fichier à la racine de l’application hôte de rendu (si n’existe pas encore) et ajoutez le paramètre de débogage :
DEBUG=sitecore-jss:multisite
Désormais, le rendu des journaux du conteneur hôte vous exposera des informations sur la façon dont le middleware multisite traite vos demandes, résout les contextes du site et définit les cookies du site. Ci-dessous un exemple (et correct) sortie du journal :
sitecore-jss:multisite multisite middleware start: { pathname: '/', language: 'en', hostname: 'second.localhost' } +8h sitecore-jss:multisite multisite middleware end in 7ms: { rewritePath: '/_site_second/', siteName: 'second', headers: { set-cookie: 'sc_site=second; Path=/', x-middleware-rewrite: 'https://localhost:3000/_site_second', x-sc-rewrite: '/_site_second/' }, cookies: ResponseCookies {"sc_site":{"name":"sc_site","value":"second","path":"/"}} } +7ms
Le journal ci-dessus est crucial pour comprendre le fonctionnement interne du middleware multisite. La requête interne est réécrite comme <https://localhost:3000/_site_second
où ‘deuxième‘ est un paramètre de nom de site tokenisé. Si .\src\main\src\temp\config.js
Le fichier contient l’enregistrement du site correspondant, le site est résolu et sc_site
le cookie est défini.
Si vous rencontrez toujours des problèmes pour afficher le deuxième site Web qui résout Principal site web malgré le journal du middleware multisite affiche une résolution de site correcte, ce qui peut probablement être dû à un conflit avec d’autres processeurs middleware. Ce serait la première chose à vérifier, surtout si vous disposez de plusieurs middlewares personnalisés. Le middleware Miltisie est particulièrement sensible à l’ordre d’exécution, car il définit des cookies. Dans mon cas, ce problème était dû au fait que le SDK Sitecore Personalize Engage était enregistré via un middleware et également programmé pour définir son propre cookie, et configuré d’une manière ou d’une autre avec un middleware multisite.
Dans ce cas, vous devez jouer avec la constante d’ordre au sein de chaque middleware en conflit (ils sont tous situés sous .\src\rrh\src\lib\middleware\plugins
dossier) avec le redémarrage suivant d’un hôte de rendu.
Partage de ressources
Étant donné que le module complémentaire multisite exploite la même application hôte de rendu pour les plusieurs sites qui l’utilisent, tous les composants et mises en page, les balises TSX, le middleware et le reste des ressources deviennent automatiquement disponibles pour le deuxième site. Cependant, cela n’est pas vrai par défaut pour les ressources Sitecore. Nous devons attribuer au moins un site Web qui partagera ses actifs, tels que les rendus, les partiels, les mises en page, etc. dans l’ensemble de la collection de sites. Heureusement, c’est assez simple à faire au niveau de la collection de sites :
Par souci d’expérimentation, faisons Deuxième site Web pour utiliser les conceptions de pages du Principal site. Après l’autorisation de partage ci-dessus, ils sont automatiquement disponibles sur /sitecore/content/Site Collection/Second/Presentation/Page Designs
article.
Configuration du cloud
Une fois que nous avons bien fait fonctionner le module complémentaire multisite, faisons le même travail dans le cloud.
- Tout d’abord, vérifiez toutes les modifications apportées au référentiel de code et déclenchez le déploiement, soit depuis Deploy App, CLI ou votre CI/CD préféré.
- Une fois vos modifications arrivées dans l’environnement XM Cloud, apportons les modifications requises à Vercel, en commençant par définir les noms d’hôte des sites :
- Après avoir défini les noms d’hôte dans Vercel, modifiez le nom d’hôte sous Regroupement de sites élément pour cet environnement cloud particulier afin qu’il corresponde au nom d’hôte ci-dessus configuré précédemment dans Vercel.
- Enregistrez les modifications et publiez intelligemment la collection de sites. La publication prend un certain temps, alors restez patient.
- Enfin, vous devez également faire un redéploiement complet de Vercel, pour forcer la régénération
\src\temp\config.js
fichier avec les noms d’hôtes d’Experience Edge publiés à l’étape précédente
Essai
Si tout est bien fait dans les étapes précédentes, vous pouvez accéder au site Web Second publié depuis Vercel par son nom d’hôte, dans notre cas, ce serait https://dev-second.vercel.app. Assurez-vous que toutes les mises en page partielles partagées sont vues comme prévu.
Lors du test des versions 404 et 500, vous verrez qu’elles sont automatiquement partagées entre les deux sites, mais vous ne pouvez pas les configurer individuellement par site. Cela se produit parce que les deux sont situés à .\src\rrh\src\pages\404.tsx
et .\src\rrh\src\pages\500.tsx
de la même application hôte de rendu et utilise des mécanismes internes différents plutôt que du contenu générique servi par Sitecore tout au long .\src\rrh\src\pages\[[...path]].tsx
itinéraire. Ces pages d’erreur pourraient cependant être multilingues, si nécessaire.
J’espère que cet article vous sera utile !
Source link