Optimzely CMS 12 – Implémentation d’un proxy inverse avec YARP
Les dernières implémentations de CMS que j’ai effectuées ont nécessité des proxys inverses pour afficher le contenu externe. Au moment où j’avais terminé mon dernier projet CMS 11, j’étais un pro des proxys inverses. Et puis CMS 12 est arrivé et a tout changé. CMS 12 déplacé vers .Net Core sur les applications Web Linux. Cette modification a supprimé la possibilité de créer les règles nécessaires pour un proxy de réserve dans le fichier web.config.
Ce serait merveilleux si Optimizely pouvait fournir la possibilité de configurer des proxys inverses au sein d’un locataire DXC (éventuellement via la configuration de Cloudflare), mais ce n’est pas encore disponible. Les deux autres alternatives consistaient à utiliser un produit comme NGINX pour s’asseoir devant Optimizely en tant que proxy inverse ou à créer le proxy inverse dans le cadre de la base de code Optimizely CMS.
YARP – Encore un autre proxy inverse
En fonction des besoins de nos clients, nous avons suivi la route du code et sélectionné YARP pour gérer nos demandes de proxy inverse au sein d’Optimizely. L’avantage de YARP est qu’il s’agit d’un proxy inverse performant et robuste, facile à configurer.
YARP est une boîte à outils de proxy inverse permettant de créer des serveurs proxy rapides dans .NET à l’aide de l’infrastructure d’ASP.NET et de .NET. Le différenciateur clé de YARP est qu’il est conçu pour être facilement personnalisé et ajusté pour répondre aux besoins spécifiques de chaque scénario de déploiement. – Blog .Net
Un proxy inverse fonctionne généralement sur la couche de transport du modèle ISO/OSI (la quatrième couche) et achemine les demandes d’un client vers d’autres serveurs. Le proxy inverse YARP, cependant, fonctionne sur la septième couche (la couche HTTP). Les connexions entrantes et sortantes sont indépendantes les unes des autres, ce qui permet de mapper les URL et de faire apparaître le contenu des URL externes.
La première étape consistait à installer le package Yarp.ReverseProxy NuGet. Cela peut être fait via le gestionnaire de packages ou en appelant la commande dotnet add package pour ajouter le package. Le proxy inverse YARP est ensuite configuré dans le fichier Startup.cs. La configuration peut être effectuée via du code ou via un fichier de configuration. L’exemple ci-dessous configure notre proxy inverse via le code.
Configuration de YARP
Le code suivant a été ajouté à notre fichier Startup.cs dans la méthode ConfigureService :
public void ConfigureServices(IServiceCollection services) { ... ... services.AddReverseProxy(); ... }
La méthode Configure a ensuite été mise à jour pour injecter un IHttpForwarder, puis configurer le proxy inverse selon les besoins. Pour notre règle, nous prenons simplement toute demande du segment d’URL /un chemin/ et transmettre cette demande à https://newurl.com/somepath/. Voici les mises à jour de la méthode Configure
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHttpForwarder forwarder) { ... ... var transformer = new CustomProxyTransformer(); var requestConfig = new ForwarderRequestConfig { ActivityTimeout = TimeSpan.FromSeconds(100) }; app.UseEndpoints(endpoints => { endpoints.MapContent(); endpoints.MapControllers(); endpoints.MapRazorPages(); endpoints.Map("/somepath/{**remainder}", async httpContext => { //send request to carehub with proxytransformer var error = await forwarder.SendAsync(httpContext, "https://newurl.com/somepath/", httpClient, requestConfig, transformer); // Check if the operation was successful if (error != ForwarderError.None) { var errorFeature = httpContext.GetForwarderErrorFeature(); var exception = errorFeature.Exception; } }); } }
Pour notre cas d’utilisation, nous devons nous assurer que les en-têtes ont été correctement définis avant que la demande ne soit transmise. Cela a été fait avec la classe CustomProxyTransformer ci-dessous :
public class CustomProxyTransformer : HttpTransformer { public override async ValueTask TransformRequestAsync(HttpContext httpContext, HttpRequestMessage proxyRequest, string destinationPrefix) { // Copy all request headers await base.TransformRequestAsync(httpContext, proxyRequest, destinationPrefix); var queryContext = new QueryTransformContext(httpContext.Request); proxyRequest.Headers.Host = "newurl.customhostheader.com"; proxyRequest.RequestUri = RequestUtilities.MakeDestinationAddress("https:// newurl.customhostheader.com ", httpContext.Request.Path, queryContext.QueryString); } }
Et c’était tout ce qui était nécessaire pour que notre proxy inverse soit opérationnel. Espérons qu’Optimzely créera la possibilité d’ajouter des proxys inverses via la configuration dans le DXC. Mais jusqu’à ce que cela soit fait, YARP est une excellente réponse provisoire aux proxys inverses dans CMS 12.
Source link