كيف يمكننا المساعدة؟

يرجى توضيح الموضوع بإيجاز، وسنرد بالبريد الإلكتروني.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
إلى الصفحة الرئيسية

Domínio próprio e proxy first-party

Como servir os arquivos do widget, a conexão do chat, o formulário offline e o Smart Answer por um subdomínio do seu site, com chave de proxy, endereço real do visitante e modelos prontos para nginx, Apache e Caddy.

Com um domínio próprio, o chat funciona por um subdomínio do seu site, por exemplo, chat.your-company.com. Seu servidor recebe as requisições do widget e as encaminha ao reactive.chat como proxy reverso. Esta página se destina à pessoa que administra esse servidor. A versão resumida para editores está em Domínio próprio (first-party).

O que passa pelo subdomínio

O que você ganha:

O que isso não significa:

Requisitos

Configuração

  1. Na conta, abra o projeto, seção Incorporar → Configurar seu domínio próprio.
  2. Em 1. Host, informe o nome, por exemplo, chat.your-company.com, e salve.
  3. Em 2. Chave de proxy, clique em Gerar chave. A chave começa com rcpx_ e é exibida exatamente uma vez; apenas um hash é armazenado. Ela deve ficar exclusivamente na configuração do proxy, nunca em uma página da web, script de navegador ou repositório.
  4. Em 3. Configuração do servidor, use o modelo do seu servidor. Logo após gerar a chave, ele a contém; depois, mostra __RC_PROXY_KEY__. Teste a configuração (nginx -t ou apachectl configtest) e recarregue o servidor.
  5. Em 5. Verificação, clique em Verificar agora (no máximo a cada 10 segundos). Nenhuma mensagem é criada.
  6. Somente quando todas as cinco etapas de verificação mostrarem “OK”, substitua o código de incorporação pelo de 4. Código de incorporação:
<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>

O widget obtém o local dos arquivos de src e a conexão do chat de data-rc-ws-url; a partir dela, deduz os endereços do formulário offline, dos uploads e do fallback HTTP. Todos os outros atributos permanecem como estão (Referência da tag script).

O que o proxy deve encaminhar

Para todas as rotas:

Para /rc_wss/, /api/offline/ e /api/suche/, o proxy define dois cabeçalhos em cada requisição:

“Define” significa que qualquer valor enviado pelo navegador com esses nomes é sobrescrito. Na rota para a rede de distribuição, ambos são removidos.

Atrás de um balanceador de carga ou CDN, seu proxy vê primeiro o endereço desse dispositivo. Nesse caso, configure o uso do endereço real: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies e {client_ip} em vez de {remote_host}. A verificação não detecta esse caso; ela só vê que um endereço válido foi definido.

Modelo nginx

A página da conta já preenche o host, os endereços de destino e a chave; o melhor é copiar o modelo de lá. A versão aqui serve de referência; os marcadores são chat.your-company.com, SITE_KEY e __RC_PROXY_KEY__. No RHEL/CentOS, o pacote de certificados de AC fica em /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;
    }
}

Modelo Apache (2.4.47 ou posterior)

Apenas o VirtualHost da porta 443; configure o redirecionamento da porta 80 e o certificado como nos seus outros hosts. SSLProxyVerifyDepth 5 é obrigatório; caso contrário, o Apache verifica apenas um nível da cadeia do destino e informa “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>

O Apache anterior à versão 2.4.47 não reconhece upgrade=websocket. Nesse caso, substitua a primeira linha ProxyPass por:

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

Modelo Caddy 2

header_up com um valor substitui o que o navegador enviou com esse nome. Se ativar logs de acesso, exclua /rc_wss/h/* (log_skip; antes do 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
            }
        }
    }
}

As cinco etapas de verificação

Cada etapa mostra “OK”, “Erro”, “Aviso” ou “não verificado”. A verificação só passa com cinco resultados “OK”. As verificações usam somente HTTPS na porta 443, sem redirecionamentos, com 5 segundos por etapa.

  1. Resolução de nomes – registros A/AAAA presentes, todos os endereços públicos. Todas as etapas seguintes se conectam exatamente a esse endereço.
  2. loader.js pelo seu domínio – o arquivo é carregado e comparado com o nosso. Sem conexão, resposta ou certificado válido, as etapas restantes são ignoradas. Um redirecionamento é um erro; um arquivo diferente indica um cache ou um destino incorreto para /.
  3. Chave e endereço do visitante – chamada de /rc_wss/eigene-domain-probe. Erros possíveis: X-RC-Proxy-Key ausente; chave desconhecida (logo após criá-la, pode haver um atraso de até 30 segundos); X-RC-Client-IP ausente ou inválido; a chave pertence a outro projeto. Há um aviso se a chave for válida, mas estiver cadastrada para outro host.
  4. WebSocket – wss://chat.your-company.com/rc_wss/ deve responder com HTTP 101 e o subprotocolo rc.v1.
  5. Formulário offline – GET /api/offline/SITE_KEY deve responder com 405 (o endpoint só aceita POST; assim, nenhuma mensagem é criada).

Você pode chamar por conta própria o endereço de verificação da etapa 3:

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

Quando configurado corretamente:

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

A chave de proxy

Solução de problemas

A seguir: Transporte e protocolo · Segurança e CSP

آخر تحديث: