Com el podem ajudar?

Expliqui’ns breument de què es tracta - li respondrem per correu electrònic.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Ves a l’inici

Dominio personalizzato e proxy first-party

Distribuire file del widget, connessione della chat, modulo offline e Smart Answer tramite un sottodominio del sito, con chiave del proxy, indirizzo reale del visitatore e modelli per nginx, Apache e Caddy.

Con un dominio personalizzato, la chat passa attraverso un sottodominio del Suo sito, ad esempio chat.your-company.com. Il Suo server accetta le richieste del widget e le inoltra a reactive.chat come proxy inverso. Questa pagina è destinata a chi gestisce quel server. La versione breve per chi cura i contenuti è in Dominio personalizzato (first-party).

Che cosa passa attraverso il sottodominio

I vantaggi:

Che cosa non è:

Requisiti

Configurazione

  1. Nell’account apra il progetto, sezione Incorporamento → Configura un dominio personalizzato.
  2. In 1. Host, inserisca il nome, ad esempio chat.your-company.com, e salvi.
  3. In 2. Chiave del proxy, faccia clic su Genera chiave. La chiave inizia con rcpx_ e viene mostrata una sola volta; ne viene conservato solo un hash. Deve trovarsi esclusivamente nella configurazione del proxy, mai in una pagina web, uno script del browser o un repository.
  4. In 3. Configurazione del server, prenda il modello adatto. Subito dopo la creazione contiene la chiave; in seguito mostra __RC_PROXY_KEY__. Verifichi la configurazione (nginx -t o apachectl configtest) e ricarichi il server.
  5. In 5. Verifica, faccia clic su Verifica ora (al massimo ogni 10 secondi). Non viene creato alcun messaggio.
  6. Solo quando tutti e cinque i passi mostrano «OK», sostituisca il codice di incorporamento con quello di 4. Codice di incorporamento:
<script src="https://chat.your-company.com/loader.js"
        data-rc-site-key="SITE_KEY"
        data-rc-ws-url="wss://chat.your-company.com/rc_wss/"
        async></script>

Il widget ricava la posizione dei file da src, la connessione della chat da data-rc-ws-url e da questa gli indirizzi di modulo offline, caricamenti e fallback HTTP. Tutti gli altri attributi restano invariati (Riferimento del tag script).

Che cosa deve inoltrare il proxy

Per tutti i percorsi:

Per /rc_wss/, /api/offline/ e /api/suche/, il proxy imposta due intestazioni su ogni richiesta:

«Imposta» significa che ciò che il browser invia con questi nomi viene sovrascritto. Sul percorso verso la rete di distribuzione entrambe vengono rimosse.

Dietro un bilanciatore di carico o una CDN, il proxy vede inizialmente l’indirizzo di quel dispositivo. Configuri quindi l’acquisizione dell’indirizzo reale: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies e {client_ip} al posto di {remote_host}. La verifica non rileva questo caso: vede solo che è impostato un indirizzo valido.

Modello nginx

La pagina dell’account compila già host, indirizzi di destinazione e chiave: è preferibile copiare il modello da lì. La versione qui è di riferimento; i segnaposto sono chat.your-company.com, SITE_KEY e __RC_PROXY_KEY__. Su RHEL/CentOS il bundle CA è in /etc/pki/tls/certs/ca-bundle.crt.

server {
    listen 80;
    listen [::]:80;
    server_name chat.your-company.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-company.com;

    ssl_certificate     /etc/letsencrypt/live/chat.your-company.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.your-company.com/privkey.pem;

    # HTTP fallback (SSE / long polling): token in the query, do not 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;
    }

    # Chat connection (WebSocket) and uploads
    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;
        proxy_buffering off;
        proxy_cache off;
        client_max_body_size 32m;
        proxy_request_buffering off;
    }

    # Offline form
    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 (website search), answer as a stream
    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;
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 120s;
    }

    # Widget files
    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;
    }
}

Modello Apache (2.4.47 o successivo)

Solo il VirtualHost per la porta 443; configuri il reindirizzamento dalla porta 80 e il certificato come per gli altri host. SSLProxyVerifyDepth 5 è necessario; altrimenti Apache verifica solo un livello della catena della destinazione e segnala «Certificate Chain too long».

<VirtualHost *:443>
    ServerName chat.your-company.com

    SetEnvIf Request_URI "^/rc_wss/h/" rc_no_log
    CustomLog ${APACHE_LOG_DIR}/chat.your-company.com_access.log combined env=!rc_no_log

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/chat.your-company.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/chat.your-company.com/privkey.pem

    SSLProxyEngine on
    SSLProxyVerify require
    SSLProxyVerifyDepth 5
    SSLProxyCheckPeerName on
    SSLProxyCACertificateFile /etc/ssl/certs/ca-certificates.crt
    ProxyRequests Off
    ProxyPreserveHost Off
    ProxyAddHeaders Off

    RequestHeader unset X-RC-Proxy-Key early
    RequestHeader unset X-RC-Client-IP early
    RequestHeader unset Cookie early
    RequestHeader unset Authorization early

    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 precedente a 2.4.47 non riconosce upgrade=websocket. In tal caso sostituisca la prima riga ProxyPass con:

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

Modello Caddy 2

header_up con un valore sostituisce ciò che il browser ha inviato con quel nome. Se attiva i registri degli accessi, escluda /rc_wss/h/* (log_skip, prima di Caddy 2.8 skip_log).

chat.your-company.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
            }
            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
            }
        }
    }
}

I cinque passi della verifica

Ogni passo mostra «OK», «Errore», «Nota» o «non verificato». La verifica è superata solo con cinque «OK». Le verifiche usano solo HTTPS sulla porta 443, senza reindirizzamenti, 5 secondi per passo.

  1. Risoluzione del nome: A/AAAA presenti, tutti gli indirizzi pubblici. Tutti i passi successivi si collegano esattamente a questo indirizzo.
  2. loader.js tramite il Suo dominio: il file viene caricato e confrontato con il nostro. Senza connessione, risposta o certificato valido, i passi rimanenti vengono saltati. Un reindirizzamento è un errore; un file diverso indica una cache o una destinazione errata per /.
  3. Chiave e indirizzo del visitatore: chiamata a /rc_wss/eigene-domain-probe. Possibili errori: X-RC-Proxy-Key mancante; chiave sconosciuta (subito dopo la creazione, ritardo fino a 30 secondi); X-RC-Client-IP mancante o non valido; chiave di un altro progetto. Una nota se la chiave è valida ma registrata per un host diverso.
  4. WebSocket: wss://chat.your-company.com/rc_wss/ deve rispondere con HTTP 101 e sottoprotocollo rc.v1.
  5. Modulo offline: GET /api/offline/SITE_KEY deve rispondere con 405 (l’endpoint accetta solo POST; così non viene creato alcun messaggio).

Può chiamare personalmente l’indirizzo di verifica del passo 3:

curl -s https://chat.your-company.com/rc_wss/eigene-domain-probe

Con configurazione corretta:

{"rc":"eigene-domain-probe","v":1,"schluessel":"gueltig","client_ip":"gesetzt","site":"SITE_KEY","host":"chat.your-company.com"}

La chiave del proxy

Risoluzione dei problemi

Successivo: Trasporto e protocollo · Sicurezza e CSP

Última actualització: