Miben segíthetünk?

Írja le röviden, miről van szó – e-mailben jelentkezünk.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Kezdőlap

Eigen domein en first-party proxy

Bied widgetbestanden, chatverbinding, offlineformulier en Smart Answer aan via een subdomein van uw website, met proxysleutel, echt bezoekersadres en sjablonen voor nginx, Apache en Caddy.

Met een eigen domein loopt de chat via een subdomein van uw website, bijvoorbeeld chat.your-company.com. Uw server ontvangt de verzoeken van de widget en geeft ze als reverse proxy door aan reactive.chat. Deze pagina is voor degene die die server beheert. De korte versie voor redacteuren staat onder Eigen domein (first-party).

Wat via het subdomein loopt

Wat het oplevert:

Wat het niet is:

Vereisten

Instellen

  1. Open in uw account het project, gedeelte Insluiten → Eigen domein instellen.
  2. Voer onder 1. Host de naam in, bijvoorbeeld chat.your-company.com, en sla op.
  3. Klik onder 2. Proxysleutel op Sleutel aanmaken. De sleutel begint met rcpx_ en wordt precies één keer getoond; alleen een hash wordt opgeslagen. Hij hoort uitsluitend in de proxyconfiguratie — nooit op een webpagina, in een browserscript of in een repository.
  4. Neem onder 3. Serverconfiguratie het sjabloon voor uw server over. Direct na het aanmaken bevat het de sleutel; later toont het __RC_PROXY_KEY__. Test de configuratie (nginx -t of apachectl configtest) en herlaad de server.
  5. Klik onder 5. Controleren op Nu controleren (maximaal elke 10 seconden). Er wordt geen bericht aangemaakt.
  6. Vervang pas als alle vijf controlestappen “OK” tonen het insluitfragment door dat uit 4. Insluitcode:
<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>

De widget haalt de locatie van zijn bestanden uit src, de chatverbinding uit data-rc-ws-url en leidt daarvan de adressen van het offlineformulier, uploads en de HTTP-fallback af. Alle andere attributen blijven ongewijzigd (Referentie van de scripttag).

Wat de proxy moet doorsturen

Voor alle routes:

Voor /rc_wss/, /api/offline/ en /api/suche/ stelt de proxy bij elk verzoek twee headers in:

“Instellen” betekent: alles wat een browser onder deze namen verstuurt, wordt overschreven. Op de route naar het distributienetwerk worden beide verwijderd.

Achter een loadbalancer of CDN ziet uw proxy eerst het adres van dat apparaat. Stel dan het overnemen van het echte adres in: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies en {client_ip} in plaats van {remote_host}. De controle herkent dit geval niet — ze ziet alleen dat een geldig adres is ingesteld.

nginx-sjabloon

De accountpagina vult host, doeladressen en sleutel al in — kopieer het sjabloon het beste daarvandaan. De versie hier dient als referentie; de tijdelijke aanduidingen zijn chat.your-company.com, SITE_KEY en __RC_PROXY_KEY__. Op RHEL/CentOS staat de CA-bundel 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;
    }
}

Apache-sjabloon (2.4.47 of nieuwer)

Alleen de VirtualHost voor poort 443; stel de omleiding vanaf poort 80 en het certificaat in zoals voor uw andere hosts. SSLProxyVerifyDepth 5 is vereist — anders controleert Apache de keten van het doel slechts één niveau diep en meldt “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 vóór 2.4.47 ondersteunt upgrade=websocket niet. Vervang dan de eerste ProxyPass-regel door:

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 2-sjabloon

header_up met een waarde vervangt alles wat de browser onder die naam verstuurt. Als u toegangslogboeken inschakelt, sluit dan /rc_wss/h/* uit (log_skip, vóór 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
            }
        }
    }
}

De vijf controlestappen

Elke stap toont “OK”, “Fout”, “Opmerking” of “niet gecontroleerd”. De controle is alleen met vijfmaal “OK” geslaagd. Er wordt uitsluitend via HTTPS op poort 443 gecontroleerd, zonder omleidingen, 5 seconden per stap.

  1. Naamomzetting — A/AAAA aanwezig, alle adressen openbaar. Alle volgende stappen verbinden met precies dit adres.
  2. loader.js via uw domein — het bestand wordt geladen en met het onze vergeleken. Zonder verbinding, antwoord of geldig certificaat worden de overige stappen overgeslagen. Een omleiding is een fout; een afwijkend bestand wijst op een cache of een verkeerd doel voor /.
  3. Sleutel en bezoekersadres — aanroep van /rc_wss/eigene-domain-probe. Mogelijke fouten: X-RC-Proxy-Key ontbreekt; sleutel onbekend (direct na aanmaken maximaal 30 seconden vertraging); X-RC-Client-IP ontbreekt of is ongeldig; de sleutel hoort bij een ander project. Een opmerking als de sleutel geldig is maar voor een andere host geregistreerd staat.
  4. WebSocket — wss://chat.your-company.com/rc_wss/ moet antwoorden met HTTP 101 en subprotocol rc.v1.
  5. Offlineformulier — GET /api/offline/SITE_KEY moet met 405 antwoorden (het endpoint accepteert alleen POST; zo wordt geen bericht aangemaakt).

U kunt het controleadres uit stap 3 zelf benaderen:

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

Bij juiste inrichting:

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

De proxysleutel

Problemen oplossen

Volgende: Transport en protocol · Beveiliging en CSP

Utolsó frissítés: