Une nouvelle façon de contrôler vos réponses HTTP

Depuis 4D 21, les développeurs 4D peuvent désormais contrôler entièrement les réponses HTTP à l’aide d’un simple fichier de configuration : HTTPRules.json. Que vous cherchiez à renforcer la sécurité, à optimiser les performances ou à gérer l’accès aux ressources statiques, cette fonctionnalité vous offre la flexibilité dont vous avez besoin, sans écrire une seule ligne de code.
Voyons maintenant quelles sont ces fonctionnalités et comment les utiliser.

Comment les règles sont-elles appliquées ?

Pour activer la fonctionnalité, placez un fichier HTTPRules.json dans le dossier Sources de votre projet.
Vous pouvez également définir les règles par programme en les définissant dans l’attribut settings.rules et en transmettant l’objet settings à la fonction Web server.start(). Cette fonction remplace les règles définies dans tout fichier existant.

Le contenu du fichier ou de l’attribut settings.rules est une collection de règles.
Chaque règle est un objet et est définie par un motif d’expression régulière (regexPattern) qui correspond à l’URI de la requête.

Les actions d’une règle sont définies par leur attribut :

  • setHeaders : pour modifier les en-têtes de la réponse HTTP.
  • addHeaders : pour ajouter des en-têtes à la réponse HTTP.
  • removeHeaders : pour supprimer des en-têtes de la réponse HTTP.
  • denyAccess : pour refuser ou autoriser l’accès à une ressource.
  • redirect : pour rediriger la requête HTTP.
  • status : pour définir un statut de réponse HTTP personnalisé.

 

Lorsque le serveur HTTP est démarré avec des règles, celles prises en compte peuvent être obtenues dans l’attribut Web server.rules.
Notez que les règles sont évaluées de manière séquentielle, et que plusieurs règles peuvent s’appliquer à une seule requête.

ACTIONS DESCRIPTION

Définir des en-têtes personnalisés

Vous pouvez mettre à jour les en-têtes existants de la réponse HTTP, et en créer s’ils n’existent pas.
Cette action est définie par l’attribut setHeaders. Il s’agit d’un objet contenant les paires d’en-têtes clé-valeur à définir dans la réponse HTTP.

Exemple :

{
   "regexPattern": "/(.*)",
   "setHeaders": {
      "X-Frame-Options": "SAMEORIGIN",
      "Content-Security-Policy": "default-src 'self'"
   }
}

Avec cette règle, toutes les réponses HTTP contiendront les en-têtes X-Frame-Options et Content-Security-Policy avec leurs valeurs définies, en plus de ceux définis par le serveur HTTP 4D.

Ajouter des en-têtes personnalisés

Vous pouvez ajouter des en-têtes personnalisés dans la réponse HTTP. C’est particulièrement utile pour les en-têtes qui peuvent avoir plusieurs instances, comme les cookies.
Cette action est définie par l’attribut addHeaders. Il s’agit d’un objet contenant les paires d’en-têtes clé-valeur à ajouter dans la réponse HTTP.

Exemple :

{
   "regexPattern": "/(.*)",
   "addHeaders": {
      "Set-Cookie": "myCookie=123456; Max-Age=14400"
   }
}

Avec cette règle, toutes les réponses HTTP contiendront en plus la valeur définie pour l’en-tête Set-Cookie, en plus de ceux définis par le serveur HTTP 4D, ou par les vôtres.

Supprimer des en-têtes

Vous pouvez supprimer des en-têtes indésirables de la réponse, tels que Server, qui expose la version de 4D.
Cette action est définie par l’attribut removeHeaders. Il s’agit d’une collection de clés d’en-tête à supprimer de la réponse HTTP.

Exemple :

{
   "regexPattern": "/(.*)",
   "removeHeaders": ["Server","X-Frame-Options"]
}

Avec cette règle, les en-têtes Server et X-Frame-Options seront supprimés de tous les en-têtes de réponse HTTP.

⚠️ Certains en-têtes ne peuvent pas être mis à jour, ajoutés ou supprimés, tels que Date et Content-Length.

Refuser/Autoriser l’accès aux ressources

Vous pouvez bloquer l’accès à des URI spécifiques en renvoyant un statut 403 Forbidden par défaut.
Cette action est définie par l’attribut denyAccess. Il s’agit d’un booléen : vrai pour refuser l’accès et faux pour l’autoriser.

Exemple :

{
   "regexPattern": "/private/(.*)",
   "denyAccess": true,
}

Avec cette règle, toutes les ressources du dossier /private/ et des sous-dossiers ne seront pas fournies.

Vous pouvez également autoriser explicitement l’accès aux sous-dossiers :

Exemple :

{
   "regexPattern": "/private/allowed/(.*)",
   "denyAccess": false
}

Avec cette règle, toutes les ressources du dossier /private/allowed/ et des sous-dossiers sont accessibles, même si la règle précédente interdisant l’accès au dossier parent /private/ est définie.

Redirection des requêtes

Vous pouvez rediriger les requêtes vers une autre URL. Vous pouvez spécifier le code de statut (301 pour permanent, 302 pour temporaire par défaut).
Cette action est définie par l’attribut redirect. Il s’agit d’un texte contenant l’url de redirection de base.

Exemple :

{
   "regexPattern": "^/images/(.*)",
   "redirect": "https://cdn.example.com/images/",
   "status": 301
}

Avec cette règle, toutes les ressources du sous-dossier images seront redirigées vers le CDN défini.
Notez que le « ^ » qui commence le motif de la regex est important dans le cas de la redirection, afin d’éviter que des URI incorrects ne soient renvoyés.

Définir des codes de statut personnalisés

Vous pouvez remplacer le code de statut par défaut d’une réponse HTTP.
Cette action est définie par l’attribut status. Il s’agit d’un nombre renvoyé comme code de statut par la réponse HTTP.

Exemple :

{
   "regexPattern": "^/maintenance.html",
   "status": 503
}

Avec cette règle, lorsque la page maintenance.html est demandée, le code de statut renvoyé sera 503.

⚠️ Assurez-vous que le statut que vous définissez vous-même soit cohérent avec la réponse envoyée par le serveur HTTP !

Combiner des actions et des règles

Plusieurs actions peuvent être combinées dans une règle si elles partagent le même motif regex.

Exemple :

{
   "regexPattern": "/docs/(.*).html",
   "addedHeaders": {
      "Cache-Control": "max-age=3600"
   },
   "removedHeaders": ["X-Powered-By"]
}

Cette règle s’applique à tous les fichiers HTML placés dans le sous-dossier docs.

Les règles peuvent également être combinées dans un ordre logique pour configurer entièrement les réponses du serveur HTTP.

Exemple d’une collection complète de règles :

[
   {
      "comment": "All requests: allow GET method for, remove 'Server' header and set security headers",
      "regexPattern": "/(.*)",
      "setHeaders": {
         "Allow": "GET",
         "X-Frame-Options": "SAMEORIGIN",
         "Content-Security-Policy": "default-src 'self'"
      },
      "removeHeaders": [
         "Server"
      ]
   },
   {
      "comment": "REST requests: allow POST method",
      "regexPattern": "/rest/(.*)",
      "addHeaders": {
         "Allow": "POST"
      }
   },
   {
      "comment": "HTML files in 'doc' folder: set cache control",
      "regexPattern": "/docs/(.*).html",
      "setHeaders": {
         "Cache-Control": "Max-Age=3600"
      },
      "removeHeaders": [
         "X-Powered-By"
      ]
   },
   {
      comment": "Status 503 on 'maintenance' page",
      "regexPattern": "^/maintenance.html",
      "status": 503
   },
   {
      "comment": "Redirect CSS and JS files",
      "regexPattern": "^(.*\\\\.(css|js))",
      "redirect": "https://cdn.example.com/"
   },
   {
      "comment": "Redirect images with permanent status code",
      "regexPattern": "^(.*\\\\.(jpg|jpeg|png|gif))",
      "redirect": "https://cdn.example.com/images/",
      "status": 301
   },
   {
      "comment": "Deny access for all resources placed in the 'private' folder",
      "regexPattern": "/private/(.*)",
      "denyAccess": true
   },
   {
      "comment": "Allow access to all resources placed in the 'private/allowed' folder",
      "regexPattern": "/private/allowed/(.*)",
      "denyAccess": false
   }
]

Résumé

Avec HTTPRules.json, 4D devient un serveur HTTP plus puissant et plus flexible. Vous pouvez désormais :

  • Ajouter, modifier ou supprimer des en-têtes.
  • Bloquer ou autoriser des accès.
  • Rediriger les requêtes.
  • Définir des codes de statut personnalisés.

 

Pas besoin d’une logique de filtrage complexe par le code, il suffit de configurer dans le fichier HTTPRules.json et c’est parti !
Et si vos applications ont besoin de règles personnalisées (par exemple des règles de sécurité) en fonction des environnements déployés ou des clients, il est très facile de le faire avec la commande Web server !
Prêt à simplifier votre déploiement web ? Commencez à utiliser les règles dès aujourd’hui.

Avatar
- Product Owner - Damien Fuzeau a rejoint l'équipe 4D Product en février 2019. En tant que Product Owner, il est en charge de la rédaction des user stories, puis de leur traduction en spécifications fonctionnelles. Son travail consiste également à s'assurer que les implémentations de fonctionnalités livrées répondent aux besoins des clients.Damien est diplômé de l'Université de Nantes en génie logiciel. Il a passé plus de 23 ans dans son ancienne entreprise, d'abord en tant que développeur (découverte de 4D en 1997), puis en tant que responsable de l'ingénierie et architecte logiciel. Cette société est un partenaire OEM de 4D et a déployé des logiciels d'entreprise basés sur 4D pour des milliers d'utilisateurs, sur des centaines de serveurs. Damien est donc habitué au développement et au déploiement 4D dans un contexte multi-langues.