Kako da vam pomognemo?

Ukratko nam recite o čemu se radi – odgovorićemo vam e-poštom.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Na početnu stranicu

Egen domän och förstapartsproxy

Så distribuerar du widgetfiler, chattanslutning, offlineformulär och Smart Answer via en underdomän till din webbplats – med proxynyckel, besökarens riktiga adress och färdiga mallar för nginx, Apache och Caddy.

Med egen domän går chatten via en underdomän till din webbplats, till exempel chat.your-company.com. Din server tar emot widgetens anrop och skickar dem vidare till reactive.chat som omvänd proxy. Den här sidan är till för den som driver servern. Den korta versionen för redaktörer finns under Egen domän (förstapart).

Vad som går via underdomänen

Vad du får:

Vad det inte är:

Förutsättningar

Konfiguration

  1. Öppna projektet i kontot, avsnittet Inbäddning → Ställ in egen domän.
  2. Under 1. Värd anger du namnet, till exempel chat.your-company.com, och sparar.
  3. Under 2. Proxynyckel klickar du på Skapa nyckel. Nyckeln börjar med rcpx_ och visas exakt en gång; bara en hash sparas. Den hör uteslutande hemma i proxykonfigurationen – aldrig på en webbsida, i ett webbläsarskript eller i ett kodarkiv.
  4. Under 3. Serverkonfiguration hämtar du mallen för din server. Direkt efter att nyckeln skapats innehåller den nyckeln; senare visas __RC_PROXY_KEY__. Testa konfigurationen (nginx -t eller apachectl configtest) och ladda om servern.
  5. Under 5. Kontroll klickar du på Kontrollera nu (högst var 10:e sekund). Inget meddelande skapas.
  6. Först när alla fem kontrollsteg visar ”OK” ersätter du inbäddningskoden med den från 4. Inbäddningskod:
<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>

Widgeten hämtar platsen för sina filer från src, chattanslutningen från data-rc-ws-url och härleder adresserna för offlineformulär, uppladdningar och HTTP-reserv från den. Alla andra attribut förblir som de är (Referens för skripttaggen).

Vad proxyn måste vidarebefordra

För alla vägar:

För /rc_wss/, /api/offline/ och /api/suche/ sätter proxyn två huvuden i varje anrop:

”Sätter” betyder: allt som en webbläsare skickar under dessa namn skrivs över. På vägen till leveransnätverket tas båda bort.

Bakom en lastbalanserare eller CDN ser proxyn först den enhetens adress. Ställ då in att den riktiga adressen hämtas: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies och {client_ip} i stället för {remote_host}. Kontrollen upptäcker inte detta fall – den ser bara att en giltig adress har angetts.

nginx-mall

Kontosidan fyller redan i värd, måladresser och nyckel – kopiera helst mallen därifrån. Versionen här är en referens; platshållarna är chat.your-company.com, SITE_KEY och __RC_PROXY_KEY__. På RHEL/CentOS finns CA-paketet under /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-mall (2.4.47 eller senare)

Bara VirtualHost för port 443; ställ in omdirigeringen från port 80 och certifikatet som för dina andra värdar. SSLProxyVerifyDepth 5 krävs – annars kontrollerar Apache målets certifikatkedja bara en nivå djupt och rapporterar ”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 före 2.4.47 känner inte till upgrade=websocket. Ersätt då den första ProxyPass-raden med:

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-mall

header_up med ett värde ersätter allt webbläsaren skickade under detta namn. Om du aktiverar åtkomstloggar, undanta /rc_wss/h/* (log_skip, före 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 fem kontrollstegen

Varje steg visar ”OK”, ”Fel”, ”Information” eller ”inte kontrollerat”. Kontrollen är godkänd först när alla fem visar ”OK”. Kontrollerna använder bara HTTPS på port 443, utan omdirigeringar, 5 sekunder per steg.

  1. Namnuppslagning – A/AAAA finns, alla adresser är offentliga. Alla efterföljande steg ansluter till exakt denna adress.
  2. loader.js via din domän – filen laddas och jämförs med vår. Utan anslutning, svar eller giltigt certifikat hoppas de återstående stegen över. En omdirigering är ett fel; en avvikande fil tyder på en cache eller ett felaktigt mål för /.
  3. Nyckel och besökaradress – anrop till /rc_wss/eigene-domain-probe. Möjliga fel: X-RC-Proxy-Key saknas; nyckeln är okänd (direkt efter att den skapats kan det ta upp till 30 sekunder); X-RC-Client-IP saknas eller är ogiltig; nyckeln hör till ett annat projekt. En informationsnotis om nyckeln är giltig men registrerad för en annan värd.
  4. WebSocket – wss://chat.your-company.com/rc_wss/ måste svara med HTTP 101 och underprotokollet rc.v1.
  5. Offlineformulär – GET /api/offline/SITE_KEY måste svara med 405 (slutpunkten tar bara emot POST; på så sätt skapas inget meddelande).

Du kan själv anropa kontrolladressen från steg 3:

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

Vid korrekt konfiguration:

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

Proxynyckeln

Felsökning

Nästa: Transport och protokoll · Säkerhet och CSP

Poslednje ažuriranje: