ہم کیسے مدد کر سکتے ہیں؟

مختصراً بتائیں کہ معاملہ کیا ہے—ہم آپ کو ای میل کے ذریعے جواب دیں گے۔

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
ابتدائی صفحے پر جائیں

Własna domena i proxy first-party

Jak serwować pliki widżetu, połączenie czatu, formularz offline i Smart Answer przez subdomenę twojej strony – z kluczem proxy, prawdziwym adresem odwiedzającego i gotowymi szablonami dla nginx, Apache i Caddy.

Z własną domeną czat działa przez subdomenę twojej strony, na przykład chat.deine-firma.de. Twój serwer przyjmuje żądania widżetu i jako reverse proxy przekazuje je do reactive.chat. Ta strona jest przeznaczona dla osoby, która prowadzi ten serwer. Wersję skróconą dla redaktorów znajdziesz w Własna domena (first-party).

Co przechodzi przez subdomenę

Co ci to daje:

Czym nie jest:

Wymagania

Konfiguracja

  1. Otwórz w koncie projekt, sekcja Osadzenie → Skonfiguruj własną domenę.
  2. W 1. Host wpisz nazwę, na przykład chat.deine-firma.de, i zapisz.
  3. W 2. Klucz proxy kliknij Utwórz klucz. Klucz zaczyna się od rcpx_ i jest pokazywany dokładnie raz; przechowywany jest tylko hash. Należy wyłącznie do konfiguracji proxy – nigdy do strony internetowej, skryptu w przeglądarce ani repozytorium.
  4. W 3. Konfiguracja serwera przejmij szablon dla swojego serwera. Zaraz po utworzeniu klucza zawiera go; później widnieje tam __RC_PROXY_KEY__. Sprawdź konfigurację (nginx -t lub apachectl configtest) i przeładuj serwer.
  5. W 5. Sprawdź kliknij Sprawdź teraz (najwyżej co 10 sekund). Nie powstaje przy tym żadna wiadomość.
  6. Dopiero gdy wszystkie pięć kroków testu pokazuje „w porządku”, zamień fragment kodu na ten z 4. Fragment kodu:
<script src="https://chat.deine-firma.de/loader.js"
        data-rc-site-key="SITE_KEY"
        data-rc-ws-url="wss://chat.deine-firma.de/rc_wss/"
        async></script>

Z src widżet bierze miejsce swoich plików, z data-rc-ws-url połączenie czatu i na tej podstawie adresy formularza offline, przesyłania plików i trybu awaryjnego HTTP. Wszystkie pozostałe atrybuty zostają bez zmian (Tag script – dokumentacja).

Co proxy musi przekazywać

Dla wszystkich dróg obowiązuje:

Dla /rc_wss/, /api/offline/ i /api/suche/ proxy przy każdym żądaniu ustawia dwa nagłówki:

„Ustawia” oznacza: to, co przeglądarka wyśle pod tymi nazwami, zostaje nadpisane. Na drodze do sieci dostarczania oba są czyszczone.

Za load balancerem lub CDN twoje proxy widzi najpierw adres tego urządzenia. Skonfiguruj wtedy przejmowanie prawdziwego adresu: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies i {client_ip} zamiast {remote_host}. Test nie wykryje tego przypadku – widzi tylko, że ustawiono prawidłowy adres.

Szablon nginx

Strona konta wstawia już host, adresy docelowe i klucz – najlepiej skopiuj szablon stamtąd. Wersja tutaj służy do wglądu; symbole zastępcze to chat.deine-firma.de, SITE_KEY i __RC_PROXY_KEY__. W RHEL/CentOS pakiet CA leży pod /etc/pki/tls/certs/ca-bundle.crt.

server {
    listen 80;
    listen [::]:80;
    server_name chat.deine-firma.de;
    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.deine-firma.de;

    ssl_certificate     /etc/letsencrypt/live/chat.deine-firma.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.deine-firma.de/privkey.pem;

    # Tryb awaryjny HTTP (SSE / long polling): token w query, nie logować
    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;
    }

    # Połączenie czatu (WebSocket) i przesyłanie plików
    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;
    }

    # Formularz offline
    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 (wyszukiwarka strony), odpowiedź jako strumień danych
    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;
    }

    # Pliki widżetu
    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;
    }
}

Szablon Apache (od 2.4.47)

Tylko VirtualHost dla portu 443; przekierowanie z portu 80 i certyfikat konfigurujesz tak jak dla pozostałych hostów. SSLProxyVerifyDepth 5 jest obowiązkowe – w przeciwnym razie Apache sprawdza łańcuch celu tylko na jeden poziom w głąb i zgłasza „Certificate Chain too long”.

<VirtualHost *:443>
    ServerName chat.deine-firma.de

    SetEnvIf Request_URI "^/rc_wss/h/" rc_no_log
    CustomLog ${APACHE_LOG_DIR}/chat.deine-firma.de_access.log combined env=!rc_no_log

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/chat.deine-firma.de/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/chat.deine-firma.de/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 przed 2.4.47 nie zna upgrade=websocket. Zastąp wtedy pierwszą linię ProxyPass przez:

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

Szablon Caddy 2

header_up z wartością zastępuje to, co przeglądarka wysłała pod tą nazwą. Jeśli włączysz logi dostępu, wyłącz z nich /rc_wss/h/* (log_skip, przed Caddy 2.8 skip_log).

chat.deine-firma.de {
    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
            }
        }
    }
}

Pięć kroków testu

Każdy krok pokazuje „w porządku”, „błąd”, „uwaga” lub „nie sprawdzono”. Test jest zaliczony tylko przy pięciu „w porządku”. Sprawdzamy wyłącznie przez HTTPS na porcie 443, bez przekierowań, 5 sekund na krok.

  1. Rozwiązywanie nazwy – jest A/AAAA, wszystkie adresy są publiczne. Wszystkie kolejne kroki łączą się dokładnie z tym adresem.
  2. loader.js przez twoją domenę – plik jest pobierany i porównywany z naszym. Bez połączenia, odpowiedzi lub ważnego certyfikatu pozostałe kroki są pomijane. Przekierowanie to błąd; inny plik wskazuje na pamięć podręczną albo zły cel dla /.
  3. Klucz i adres odwiedzającego – wywołanie /rc_wss/eigene-domain-probe. Możliwe błędy: brak X-RC-Proxy-Key; nieznany klucz (zaraz po utworzeniu do 30 sekund opóźnienia); brak lub nieprawidłowy X-RC-Client-IP; klucz należy do innego projektu. Uwaga, gdy klucz jest ważny, ale zarejestrowany dla innego hosta.
  4. WebSocket – wss://chat.deine-firma.de/rc_wss/ musi odpowiedzieć HTTP 101 z podprotokołem rc.v1.
  5. Formularz offline – GET /api/offline/SITE_KEY musi odpowiedzieć 405 (endpoint przyjmuje tylko POST; dzięki temu nie powstaje żadna wiadomość).

Adres testowy z kroku 3 możesz wywołać sam:

curl -s https://chat.deine-firma.de/rc_wss/eigene-domain-probe

Przy prawidłowej konfiguracji:

{"rc":"eigene-domain-probe","v":1,"schluessel":"gueltig","client_ip":"gesetzt","site":"SITE_KEY","host":"chat.deine-firma.de"}

Klucz proxy

Rozwiązywanie problemów

Dalej: Transport i protokół · Bezpieczeństwo i CSP

آخری بار تازہ کاری: