Nola lagun zaitzakegu?

Esaguzu labur zertaz ari zaren, eta posta elektronikoz erantzungo dizugu.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Itzuli hasierako orrira

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

Azken eguneratzea: