Domaine personnalisé (première partie)
Distribuer le widget, la connexion du chat et le formulaire hors ligne depuis un sous-domaine de votre site : prérequis, configuration, modèles nginx, Apache et Caddy, dépannage.
Avec un domaine personnalisé, le chat passe par un sous-domaine de votre site, par exemple chat.your-domain.com. Votre serveur reçoit les requêtes du widget et les transmet à reactive.chat comme proxy inverse. Cette page s’adresse à la personne qui administre ce serveur.
Ce qu’apporte un domaine personnalisé
Les éléments suivants passent par votre sous-domaine :
- les fichiers du widget (
loader.jset le noyau chargé ensuite), - la connexion du chat (WebSocket), y compris les pièces jointes,
- le formulaire hors ligne, qui prend le relais lorsque la connexion du chat ne peut pas être établie.
Conséquences :
- Aucune requête vers des domaines tiers. Pour ces voies, les navigateurs de vos visiteurs communiquent uniquement avec votre sous-domaine, pas avec un domaine reactive.chat.
- Bloqueurs de publicités. Les listes de filtres fondées sur les noms de domaine ne reconnaissent plus le chat à son domaine reactive.chat.
- Une adresse pour votre Content Security Policy.
script-srcetconnect-srcindiquent votre sous-domaine à la place des adresses reactive.chat.connect-srcen a besoin sous deux formes : avecwss://pour la connexion du chat et avechttps://pour le formulaire hors ligne, les envois de fichiers et le repli HTTP (lorsqu’un proxy bloque WebSocket). - L’adresse réelle du visiteur est transmise. Votre proxy nous communique l’adresse du visiteur dans un en-tête dédié, protégé par une clé secrète. La protection contre les abus (limitation de fréquence et blocage) compte alors par visiteur plutôt que par proxy, et la conversation indique l’adresse du visiteur.
Ce que ce n’est pas
- Ce n’est pas de l’auto-hébergement. Votre serveur ne fait que transmettre. Les conversations, pièces jointes et réglages restent traités et stockés par reactive.chat, exactement comme sans domaine personnalisé.
- Aucune conclusion sur le consentement. La nécessité du consentement de vos visiteurs et les finalités concernées sont une question distincte. Le domaine personnalisé ne change pas qui traite les données. Une formulation pour votre politique de confidentialité figure dans le bloc de texte pour votre politique de confidentialité.
- Votre serveur voit le trafic. La connexion TLS du visiteur se termine sur votre proxy. Les messages et pièces jointes y sont brièvement déchiffrés avant d’être transmis à nos serveurs, de nouveau chiffrés. Ne journalisez pas les corps de requête sur le proxy.
Prérequis
- Votre propre serveur ou proxy inverse, accessible depuis Internet par HTTPS sur le port 443 et autorisé à ouvrir des connexions HTTPS sortantes. Des modèles sont disponibles pour nginx (avec le module ssl), Apache à partir de 2.4.47 et Caddy 2.
- Pour Apache, les modules mod_ssl, mod_proxy, mod_proxy_http, mod_proxy_wstunnel et mod_headers. Apache ne prend en charge
upgrade=websocketqu’à partir de 2.4.47 ; pour les versions antérieures, la fin du modèle propose une solution de repli avec mod_rewrite. - Un sous-domaine réservé au chat, par exemple
chat.your-domain.com. Le chat a besoin de l’hôte entier ; un chemin commewww.your-domain.com/chat/ne fonctionne pas. Saisissez seulement le nom, sanshttps://, port ni chemin. Sont exclus : adresses IP, extensions internes comme.local,.lanou.internal, et noms sous reactive.chat. - Le même domaine que votre site. Le chat n’est de première partie que si le sous-domaine appartient au domaine du site où il est intégré. Sinon, il fonctionne quand même et la page du compte signale la différence.
- Un enregistrement DNS (A et/ou AAAA) pointant vers votre serveur. Toutes les adresses du nom doivent être publiques.
- Un certificat TLS pour le sous-domaine. Les modèles nginx et Apache utilisent les chemins de certbot (Let’s Encrypt) ; Caddy obtient lui-même son certificat.
- L’autorisation de modifier le projet dans votre compte reactive.chat.
Derrière un répartiteur de charge ou un CDN, votre proxy voit d’abord l’adresse de cet équipement au lieu de celle du visiteur. Configurez alors la récupération de l’adresse réelle : module real_ip de nginx (set_real_ip_from, real_ip_header), mod_remoteip d’Apache (RemoteIPHeader, RemoteIPTrustedProxy), option trusted_proxies de Caddy et variable {client_ip} à la place de {remote_host}. Notre vérification ne peut pas détecter ce cas : elle voit seulement qu’une adresse valide est définie, pas de quelle adresse il s’agit.
Configuration étape par étape
- Ouvrir la page. Ouvrez le projet dans votre compte. Dans la section « Intégration », vous trouverez le lien Configurer un domaine personnalisé.
- Saisir l’hôte. Sous « 1. Hôte », saisissez le nom, par exemple
chat.your-domain.com, puis enregistrez. - Créer la clé. Sous « 2. Clé du proxy », cliquez sur Créer une clé. La clé commence par
rcpx_et n’est affichée qu’une seule fois ; nous n’en conservons qu’un hachage. Copiez-la immédiatement. Elle est secrète et doit figurer uniquement dans la configuration du proxy, jamais dans une page web, un script de navigateur ou un dépôt. - Insérer le modèle. Sous « 3. Configuration du serveur », vous trouverez des modèles prêts à l’emploi pour nginx, Apache et Caddy. Juste après la création de la clé, ils la contiennent déjà ; ensuite, ils affichent
__RC_PROXY_KEY__, à remplacer par la clé. Adaptez les chemins des certificats si nécessaire, testez la configuration (nginx -touapachectl configtest) et rechargez le serveur. - Vérifier. Sous « 5. Vérifier », cliquez sur Vérifier maintenant. Nous appelons votre sous-domaine depuis l’extérieur et vérifions séparément cinq voies (voir ci-dessous). Aucun message n’est créé. Il faut attendre au moins 10 secondes avant une nouvelle vérification.
- Remplacer le code. Uniquement lorsque les cinq étapes indiquent « OK », remplacez le code d’intégration actuel de votre site par celui de « 4. Code d’intégration ».
Le nouveau code se présente ainsi : les deux adresses pointent vers votre sous-domaine.
<script src="https://chat.your-domain.com/loader.js"
data-rc-site-key="SITE_KEY"
data-rc-ws-url="wss://chat.your-domain.com/rc_wss/"
async></script>
Le widget déduit l’emplacement de ses fichiers de src et la connexion du chat de data-rc-ws-url, puis en déduit l’adresse du formulaire hors ligne. Les autres attributs, comme data-rc-locale, restent inchangés ; ils sont décrits sous Intégrer le widget. Le code de la page du compte contient aussi votre couleur de marque.
Les cinq étapes de vérification
Chaque étape indique « OK », « Erreur », « Remarque » ou « non vérifié ». La vérification n’est réussie que si les cinq indiquent « OK » ; une remarque ne vaut pas réussite. Les contrôles utilisent uniquement HTTPS sur le port 443, ne suivent pas les redirections et disposent de 5 secondes chacun.
- Résolution de nom. Le nom doit posséder un enregistrement DNS et toutes ses adresses doivent être publiques. L’absence d’enregistrements A et AAAA est signalée, de même que toute adresse privée, locale ou réservée : nous ne vérifions pas ces adresses. Toutes les étapes suivantes se connectent exactement à l’adresse vérifiée ici.
- loader.js via votre domaine. Nous chargeons
https://chat.your-domain.com/loader.jset comparons le fichier au nôtre. En l’absence de connexion, de réponse ou de certificat valide, les étapes restantes sont ignorées (« non vérifié »). Une redirection renvoyée à la place du fichier est une erreur. Si le fichier diffère du nôtre, la cause est généralement un cache du proxy ou une mauvaise cible pour/. - Clé et adresse du visiteur. Nous appelons une adresse de vérification sous
/rc_wss/. Notre serveur indique s’il a reçu une clé et une adresse de visiteur valides, et à quel projet appartient la clé. Erreurs possibles : en-têteX-RC-Proxy-Keyabsent ; clé inconnue (erreur de saisie, clé obsolète ou supprimée ; juste après sa création, la prise en compte peut prendre jusqu’à 30 secondes) ; en-têteX-RC-Client-IPabsent ou sans adresse valide ; clé appartenant à un autre projet. Une remarque apparaît si la clé est valide mais enregistrée pour un autre hôte. - Connexion du chat (WebSocket). Nous ouvrons une connexion WebSocket via
wss://chat.your-domain.com/rc_wss/et attendons HTTP 101 avec le protocolerc.v1. « Pas de mise à niveau WebSocket » signifie que le proxy ne transmet pas les en-têtesUpgradeetConnection. - Formulaire hors ligne. Nous appelons
https://chat.your-domain.com/api/offline/SITE_KEYavec GET. Notre point de terminaison répond HTTP 405, car il n’accepte que POST : cela confirme que la requête nous parvient, sans créer de message. Autres résultats : origine rejetée (remarque, voir dépannage), projet inactif, cible exigeant une authentification (HTTP 401).
Les étapes 2 à 5 peuvent aussi signaler HTTP 421 (en-tête Host, voir dépannage). Si l’étape 3 ou 5 indique « La réponse ne vient pas de reactive.chat », ce chemin pointe vers une mauvaise cible dans votre proxy.
Ce que le proxy doit transmettre
/rc_wss/vers le serveur de chat reactive.chat, avec mise à niveau WebSocket et délai d’expiration long (3600 secondes dans les modèles). Les envois de fichiers utilisent le même chemin, jusqu’à 32 Mo par fichier selon le forfait./api/offline/vers le même serveur. Le widget y envoie le formulaire hors ligne.- Tout le reste vers le réseau de distribution reactive.chat.
loader.jset les autres fichiers du widget en proviennent.
Pour les trois voies :
- L’en-tête Host et le SNI correspondent au nom de la cible, pas à votre sous-domaine. Notre serveur répond HTTP 421 à un hôte inconnu.
- Le certificat de la cible est vérifié.
- Aucun cookie ni identifiant. Les en-têtes
CookieetAuthorizationdu navigateur ne sont pas transmis. - Aucune redirection. Un cache n’est pas nécessaire. Si vous en ajoutez un, gardez une durée courte pour
loader.js: son nom ne comporte pas de numéro de version.
Pour /rc_wss/ et /api/offline/, le proxy définit aussi deux en-têtes sur chaque requête :
X-RC-Proxy-Key– votre clé.X-RC-Client-IP– l’adresse du visiteur telle que votre proxy la voit.
« Définit » signifie que tout ce qu’un navigateur envoie sous ces noms est écrasé et ne nous parvient jamais. Sur la voie du réseau de distribution, les deux en-têtes sont vidés ; la clé ne va qu’au serveur de chat.
Repli HTTP via votre domaine
Si le réseau d’un visiteur ne laisse pas passer WebSocket, le widget passe automatiquement au repli HTTP. Il utilise le même chemin /rc_wss/ et ne nécessite aucune entrée supplémentaire dans le proxy. Deux conditions sont nécessaires :
- Transmettre les réponses sans mise en tampon. Le proxy doit transmettre immédiatement les réponses sur
/rc_wss/: avec nginxproxy_buffering offetproxy_cache off, avec Apacheflushpackets=on, avec Caddyflush_interval -1. Les modèles ci-dessous contiennent déjà ces réglages. - HTTPS dans la Content Security Policy.
connect-srcdoit contenir votre sous-domaine avecwss://ethttps://, par exempleconnect-src 'self' wss://chat.your-domain.com https://chat.your-domain.com.
Les modèles
Les modèles ci-dessous correspondent à ceux de la page du compte. Celle-ci renseigne déjà votre hôte, les adresses cibles valides pour votre compte et, juste après sa création, votre clé. Il est donc préférable de copier le modèle depuis cette page ; les versions ci-dessous servent de référence. Les valeurs à remplacer sont chat.your-domain.com, SITE_KEY et __RC_PROXY_KEY__.
nginx
À placer dans le contexte http, par exemple sous /etc/nginx/conf.d/chat.your-domain.com.conf. Sur RHEL et CentOS, le bundle d’autorités de certification se trouve dans /etc/pki/tls/certs/ca-bundle.crt au lieu de /etc/ssl/certs/ca-certificates.crt.
# reactive.chat - own domain (first-party proxy) for site key SITE_KEY
# Host: chat.your-domain.com
#
# Needs nginx >= 1.7 with the ssl module. Put this file into the http
# context (e.g. /etc/nginx/conf.d/chat.your-domain.com.conf), adjust the certificate
# paths if you do not use certbot, then: nginx -t && systemctl reload nginx
#
# The proxy key is a secret: never put it into a web page or a repository.
# X-RC-Proxy-Key and X-RC-Client-IP are always SET here - whatever a browser
# sends under these names is overwritten.
server {
listen 80;
listen [::]:80;
server_name chat.your-domain.com;
location /.well-known/acme-challenge/ { root /var/www/html; }
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name chat.your-domain.com;
ssl_certificate /etc/letsencrypt/live/chat.your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.your-domain.com/privkey.pem;
# Chat connection (WebSocket). Host header and SNI must be the upstream
# name - reactive.chat answers 421 to any other host.
# HTTP fallback (Server-Sent Events / long polling): its requests carry a
# short-lived connection token in the query string - EventSource cannot
# send headers. Same settings as /rc_wss/ below, but kept out of the
# access log.
location /rc_wss/h/ {
access_log off;
proxy_pass https://ws.reactive.chat/rc_wss/h/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
proxy_cache off;
}
location /rc_wss/ {
proxy_pass https://ws.reactive.chat/rc_wss/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
# Unbuffered: if a visitor's network blocks WebSockets, the widget
# falls back to Server-Sent Events / long polling on this path.
proxy_buffering off;
proxy_cache off;
# File attachments are uploaded through this path as well (PUT
# /rc_wss/upload/...). nginx allows 1 MB by default; reactive.chat
# accepts up to 32 MB per file depending on the plan.
client_max_body_size 32m;
proxy_request_buffering off;
}
# Offline form fallback (HTTP POST from the widget).
location /api/offline/ {
proxy_pass https://ws.reactive.chat/api/offline/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_hide_header Set-Cookie;
client_max_body_size 32k;
proxy_read_timeout 30s;
}
# Smart Answer for site search (suche.js and the HTTP API). Same rules as
# the offline route: key and visitor address are set here.
location /api/suche/ {
proxy_pass https://ws.reactive.chat/api/suche/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host ws.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name ws.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
proxy_set_header X-RC-Client-IP $remote_addr;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_hide_header Set-Cookie;
client_max_body_size 8k;
# The answer is a stream (Server-Sent Events): pass it on unbuffered.
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 120s;
}
# Widget files (loader.js, core.*.js ...). No caching required; if you
# add a cache, keep it short for loader.js (it is not versioned).
location / {
proxy_pass https://cdn.reactive.chat/;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host cdn.reactive.chat;
proxy_ssl_server_name on;
proxy_ssl_name cdn.reactive.chat;
proxy_ssl_verify on;
proxy_ssl_verify_depth 3;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_set_header X-RC-Proxy-Key "";
proxy_set_header X-RC-Client-IP "";
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_hide_header Set-Cookie;
}
}
# On RHEL/CentOS the CA bundle is /etc/pki/tls/certs/ca-bundle.crt.
# Behind a load balancer/CDN, $remote_addr is the balancer: configure the
# real_ip module so that it holds the visitor's address.
Apache
Le modèle contient uniquement le VirtualHost du port 443. Configurez la redirection du port 80 et le certificat comme pour vos autres hôtes. SSLProxyVerifyDepth 5 est nécessaire : sans ce réglage, Apache ne vérifie qu’un niveau de la chaîne de certificats de la cible et la connexion échoue avec « Certificate Chain too long ».
# reactive.chat - own domain (first-party proxy) for site key SITE_KEY
# Host: chat.your-domain.com
#
# Needs Apache >= 2.4.47 with mod_ssl, mod_proxy, mod_proxy_http,
# mod_proxy_wstunnel, mod_headers and mod_setenvif:
# a2enmod ssl proxy proxy_http proxy_wstunnel headers setenvif
# Adjust the certificate paths if you do not use certbot, then:
# apachectl configtest && systemctl reload apache2
#
# The proxy key is a secret: never put it into a web page or a repository.
<VirtualHost *:443>
ServerName chat.your-domain.com
# HTTP fallback requests (/rc_wss/h/...) carry a short-lived connection
# token in the query string - keep them out of the access log.
SetEnvIf Request_URI "^/rc_wss/h/" rc_no_log
# ${APACHE_LOG_DIR} is set on Debian/Ubuntu; elsewhere e.g. /var/log/httpd.
CustomLog ${APACHE_LOG_DIR}/chat.your-domain.com_access.log combined env=!rc_no_log
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/chat.your-domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/chat.your-domain.com/privkey.pem
# Upstream TLS: verified, SNI = upstream name (ProxyPreserveHost Off
# sends the upstream name as Host - reactive.chat answers 421 otherwise).
SSLProxyEngine on
SSLProxyVerify require
# Apache checks only ONE certificate deep by default; the upstream chain
# (leaf, intermediate, root) is longer: "Certificate Chain too long".
SSLProxyVerifyDepth 5
SSLProxyCheckPeerName on
SSLProxyCACertificateFile /etc/ssl/certs/ca-certificates.crt
ProxyRequests Off
ProxyPreserveHost Off
ProxyAddHeaders Off
# Whatever the browser sends under these names never reaches upstream.
RequestHeader unset X-RC-Proxy-Key early
RequestHeader unset X-RC-Client-IP early
RequestHeader unset Cookie early
RequestHeader unset Authorization early
# Longest path first. flushpackets=on on /rc_wss/: if a visitor's network
# blocks WebSockets, the widget falls back to Server-Sent Events / long
# polling on this path, and those must not be buffered.
ProxyPass "/rc_wss/" "https://ws.reactive.chat/rc_wss/" upgrade=websocket timeout=3600 flushpackets=on
ProxyPass "/api/offline/" "https://ws.reactive.chat/api/offline/" timeout=30
ProxyPass "/api/suche/" "https://ws.reactive.chat/api/suche/" timeout=120 flushpackets=on
ProxyPass "/" "https://cdn.reactive.chat/"
<Location "/rc_wss/">
RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
</Location>
<Location "/api/offline/">
RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
Header unset Set-Cookie
</Location>
<Location "/api/suche/">
RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
Header unset Set-Cookie
</Location>
</VirtualHost>
# Apache < 2.4.47 has no upgrade=websocket. Instead of the first ProxyPass:
# RewriteEngine on
# RewriteCond %{HTTP:Upgrade} =websocket [NC]
# RewriteRule ^/rc_wss/(.*) "wss://ws.reactive.chat/rc_wss/$1" [P,L]
# ProxyPass "/rc_wss/" "https://ws.reactive.chat/rc_wss/" timeout=3600 flushpackets=on
Caddy
Caddy obtient lui-même le certificat ; WebSocket ne nécessite aucun réglage supplémentaire. header_up avec une valeur remplace ce que le navigateur a envoyé sous ce nom.
# reactive.chat - own domain (first-party proxy) for site key SITE_KEY
# Host: chat.your-domain.com
#
# Caddy 2 obtains the certificate itself. WebSockets need no extra setting.
# The proxy key is a secret: never put it into a web page or a repository.
# header_up with a value REPLACES what the browser sent under that name.
# If you enable access logging (log directive), skip the HTTP fallback
# requests - they carry a short-lived token in the query string:
# log_skip /rc_wss/h/* (Caddy < 2.8: skip_log /rc_wss/h/*)
chat.your-domain.com {
handle /rc_wss/* {
reverse_proxy https://ws.reactive.chat {
header_up Host ws.reactive.chat
header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
header_up X-RC-Client-IP {remote_host}
header_up -Cookie
header_up -Authorization
transport http {
tls_server_name ws.reactive.chat
}
flush_interval -1
}
}
handle /api/offline/* {
reverse_proxy https://ws.reactive.chat {
header_up Host ws.reactive.chat
header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
header_up X-RC-Client-IP {remote_host}
header_up -Cookie
header_up -Authorization
header_down -Set-Cookie
transport http {
tls_server_name ws.reactive.chat
}
}
}
handle /api/suche/* {
reverse_proxy https://ws.reactive.chat {
header_up Host ws.reactive.chat
header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
header_up X-RC-Client-IP {remote_host}
header_up -Cookie
header_up -Authorization
header_down -Set-Cookie
transport http {
tls_server_name ws.reactive.chat
}
# The answer is a stream (Server-Sent Events): pass it on unbuffered.
flush_interval -1
}
}
handle {
reverse_proxy https://cdn.reactive.chat {
header_up Host cdn.reactive.chat
header_up -X-RC-Proxy-Key
header_up -X-RC-Client-IP
header_up -Cookie
header_up -Authorization
header_down -Set-Cookie
transport http {
tls_server_name cdn.reactive.chat
}
}
}
}
La clé du proxy
- Rotation. Créer une nouvelle clé délivre immédiatement une nouvelle clé. La précédente reste valide pendant 24 heures, pour permettre le remplacement sans interruption ; vérifiez de nouveau ensuite. Il y a au maximum deux clés valides : une nouvelle rotation pendant ces 24 heures invalide immédiatement la plus ancienne.
- Suppression. Supprimer la clé invalide immédiatement la clé, ainsi qu’une ancienne clé encore valide après une rotation. Supprimer le domaine retire l’hôte et la clé ensemble. Rétablissez d’abord la forme habituelle du code d’intégration sur votre site.
- Si la clé est absente ou incorrecte, le chat continue de fonctionner : les deux en-têtes ne sont simplement pas pris en compte. Mais tous les visiteurs apparaissent avec l’adresse de votre proxy. Comme la protection contre les abus compte les connexions et requêtes par adresse, elle peut limiter ou bloquer votre proxy entier, et donc tous les visiteurs à la fois. Cela s’applique aussi au formulaire hors ligne.
- Un projet par clé. Une clé appartient exactement à un projet et à son hôte enregistré. Si un widget portant la clé de site d’un autre projet se connecte via un proxy doté d’une clé valide, la connexion du chat est rejetée. Pour un autre projet, configurez un sous-domaine et une clé distincts.
- Si la clé a fuité : toute personne qui la connaît peut déclarer des adresses de visiteur arbitraires pour votre projet. Supprimez-la, puis créez-en une autre et installez-la dans votre proxy. Le chat continue de fonctionner entre-temps, simplement avec l’adresse du proxy.
Dépannage
HTTP 421 (Misdirected Request)
Notre serveur rejette l’en-tête Host : votre proxy envoie votre propre nom au lieu du nom de la cible. L’en-tête Host et le SNI doivent correspondre au nom de la cible : dans nginx, proxy_set_header Host et proxy_ssl_server_name on avec proxy_ssl_name ; dans Apache, ProxyPreserveHost Off ; dans Caddy, header_up Host et tls_server_name.
HTTP 502 ou erreurs SSL vers la cible
Le proxy ne peut pas établir la connexion TLS à nos serveurs ou ne fait pas confiance au certificat.
- Apache : si le journal d’erreurs indique « Certificate Chain too long »,
SSLProxyVerifyDepth 5manque. - nginx : le chemin de
proxy_ssl_trusted_certificateest-il correct (voir ci-dessus pour RHEL et CentOS) ?proxy_ssl_server_name onest-il défini ? - En général : votre serveur doit être autorisé à ouvrir des connexions sortantes sur le port 443.
HTTP 413 lors de l’envoi de pièces jointes
Les envois passent par /rc_wss/. Sans réglage spécifique, nginx n’accepte que 1 Mo ; le modèle définit donc client_max_body_size 32m dans la section /rc_wss/. Si un répartiteur de charge ou un CDN précède votre proxy, sa limite doit être au moins aussi élevée.
Connexion du chat sans mise à niveau
La vérification signale « Pas de mise à niveau WebSocket » avec l’état HTTP reçu à la place. Le chat continue alors via le repli HTTP, mais ne se connecte qu’après deux tentatives WebSocket échouées.
- nginx : la section
/rc_wss/nécessiteproxy_http_version 1.1,proxy_set_header Upgrade $http_upgradeetproxy_set_header Connection "upgrade". - Apache : version 2.4.47 ou ultérieure avec
upgrade=websocketet mod_proxy_wstunnel activé ; pour les versions antérieures, utilisez la solution de repli en fin de modèle. - En amont : un CDN ou un répartiteur de charge placé devant le proxy doit laisser passer WebSocket.
HTTP 401 ou 403 sur le formulaire hors ligne
- 401 : un élément intermédiaire exige une authentification, généralement une protection par mot de passe sur l’hôte du proxy.
/api/offline/doit être accessible sans authentification. - 403, avec une remarque sur l’origine : la requête nous parvient, mais l’origine ne correspond pas au projet. Les « Origines autorisées » du projet doivent contenir le domaine de votre site, celui où le chat est intégré, pas le sous-domaine du chat.
- 403 avec « La réponse ne vient pas de reactive.chat » : le rejet vient d’un élément en amont, tel qu’un pare-feu applicatif web ou une règle d’accès sur votre serveur.
Le DNS pointe vers une adresse privée
La vérification signale une adresse non publique si au moins une adresse du nom est privée, locale ou réservée (par exemple 10.0.0.0/8, 192.168.0.0/16, 100.64.0.0/10 ou fc00::/7). Les causes courantes sont un enregistrement DNS interne ou un répartiteur de charge interne. Vos visiteurs ne peuvent pas non plus accéder à ces adresses ; l’enregistrement public doit pointer vers une adresse publique.
Vérifier manuellement
Vous pouvez appeler vous-même l’adresse de vérification de l’étape 3 :
curl -s https://chat.your-domain.com/rc_wss/eigene-domain-probe
Avec une configuration correcte, la réponse est :
{"rc":"eigene-domain-probe","v":1,"schluessel":"gueltig","client_ip":"gesetzt","site":"SITE_KEY","host":"chat.your-domain.com"}
Les valeurs sont des mots allemands : schluessel (clé) vaut gueltig (valide), unbekannt (inconnue) ou fehlt (absente) ; client_ip vaut gesetzt (définie), fehlt (absente) ou ungueltig (invalide). site et host ne sont présents qu’avec une clé valide. La réponse ne contient jamais d’adresse.
Pour en savoir plus dans la documentation
Pour approfondir : Domaine personnalisé et proxy de première partie. Retrouvez tous les chapitres dans la documentation.
最后更新: