Jamdesk Documentation logo

反向代理

使用 nginx、Apache、Caddy、Traefik 或 HAProxy 在 /docs 路径提供文档服务。包含经过测试的各反向代理配置片段。

在 nginx、Apache、Caddy、Traefik 或 HAProxy 中添加 location/route 块,将 /docs 流量转发到您的 Jamdesk 子域名。

前置条件

  • 有权访问您的 Web 服务器配置
  • 您的 Jamdesk 子域名(可在仪表板设置中找到)

使用自定义子路径而非默认的 /docs?请在下面每个 location/route 块中将 /docs 替换为您的子路径。在仪表板中重命名子路径后,需要再次更新配置。

nginx

添加 location 块,将 /docs 请求代理到 Jamdesk:

nginx.conf
server {
    listen 443 ssl;
    server_name yoursite.com;

    # Your existing configuration...

    # Proxy /docs to Jamdesk
    location /docs {
        proxy_pass https://YOUR_SLUG.jamdesk.app;
        proxy_ssl_server_name on;

        proxy_set_header Host YOUR_SLUG.jamdesk.app;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Required for domain verification
        proxy_set_header X-Jamdesk-Forwarded-Host $host;
    }

    # Next.js static assets (JS, CSS)
    location /_next/ {
        proxy_pass https://YOUR_SLUG.jamdesk.app;
        proxy_ssl_server_name on;
        proxy_set_header Host YOUR_SLUG.jamdesk.app;
    }

    # Jamdesk assets (fonts, images, branding)
    location /_jd/ {
        proxy_pass https://YOUR_SLUG.jamdesk.app;
        proxy_ssl_server_name on;
        proxy_set_header Host YOUR_SLUG.jamdesk.app;
    }

}

将 YOUR_SLUG 替换为您的 Jamdesk 子域名。

路径处理很重要。 proxy_pass URL 不带尾随路径。nginx 会保留原始请求路径。对 /docs/page 的请求会代理到 jamdesk.app/docs/page。尾随斜杠(proxy_pass https://...jamdesk.app/)会去掉 /docs 前缀。请严格按照上面所示保持原样。

重新加载 nginx:

sudo nginx -t && sudo systemctl reload nginx

Apache

使用 mod_proxy 将 /docs 请求转发到 Jamdesk:

httpd.conf or .htaccess
<VirtualHost *:443>
    ServerName yoursite.com

    # Your existing configuration...

    # Enable proxy modules
    ProxyRequests Off
    SSLProxyEngine On

    # Proxy /docs to Jamdesk
    ProxyPass /docs https://YOUR_SLUG.jamdesk.app/docs
    ProxyPassReverse /docs https://YOUR_SLUG.jamdesk.app/docs

    # Next.js static assets (JS, CSS)
    ProxyPass /_next https://YOUR_SLUG.jamdesk.app/_next
    ProxyPassReverse /_next https://YOUR_SLUG.jamdesk.app/_next

    # Jamdesk assets (fonts, images, branding)
    ProxyPass /_jd https://YOUR_SLUG.jamdesk.app/_jd
    ProxyPassReverse /_jd https://YOUR_SLUG.jamdesk.app/_jd

    <Location /docs>
        RequestHeader set X-Forwarded-Host "yoursite.com"
        RequestHeader set X-Forwarded-Proto "https"
        # Required for domain verification
        RequestHeader set X-Jamdesk-Forwarded-Host "yoursite.com"
    </Location>
</VirtualHost>

启用所需模块:

sudo a2enmod proxy proxy_http ssl headers
sudo systemctl reload apache2

Caddy

Caddy 会自行配置 HTTPS。添加以下 handle 块:

Caddyfile
yoursite.com {
    # Your existing configuration...

    handle /docs* {
        reverse_proxy https://YOUR_SLUG.jamdesk.app {
            header_up Host {upstream_hostport}
            header_up X-Forwarded-Host {host}
            # Required for domain verification
            header_up X-Jamdesk-Forwarded-Host {host}
        }
    }

    # Next.js static assets and Jamdesk assets
    handle /_next/* {
        reverse_proxy https://YOUR_SLUG.jamdesk.app {
            header_up Host {upstream_hostport}
        }
    }

    handle /_jd/* {
        reverse_proxy https://YOUR_SLUG.jamdesk.app {
            header_up Host {upstream_hostport}
        }
    }

    # Handle other routes
    handle {
        # Your main site configuration
    }
}

更改后重新加载 Caddy:

sudo systemctl reload caddy

Traefik

配置 Traefik 路由器和服务:

traefik.yml
http:
  routers:
    docs-router:
      rule: "Host(`yoursite.com`) && (PathPrefix(`/docs`) || PathPrefix(`/_next`) || PathPrefix(`/_jd`))"
      service: jamdesk-docs
      middlewares:
        - jamdesk-headers
      tls: {}

  middlewares:
    jamdesk-headers:
      headers:
        customRequestHeaders:
          # Required for domain verification
          X-Jamdesk-Forwarded-Host: "yoursite.com"

  services:
    jamdesk-docs:
      loadBalancer:
        servers:
          - url: "https://YOUR_SLUG.jamdesk.app"
        passHostHeader: false

HAProxy

添加 HAProxy 后端和 ACL 规则:

haproxy.cfg
frontend https
    bind *:443 ssl crt /etc/ssl/certs/yoursite.pem

    # Route /docs and assets to Jamdesk backend
    acl is_docs path_beg /docs
    acl is_next path_beg /_next
    acl is_jd path_beg /_jd
    use_backend jamdesk_docs if is_docs or is_next or is_jd

    # Default backend for other requests
    default_backend main_site

backend jamdesk_docs
    server jamdesk YOUR_SLUG.jamdesk.app:443 ssl verify none
    http-request set-header Host YOUR_SLUG.jamdesk.app
    http-request set-header X-Forwarded-Host %[req.hdr(host)]
    # Required for domain verification
    http-request set-header X-Jamdesk-Forwarded-Host %[req.hdr(host)]

同时转发根目录文件

robots.txt、sitemap.xml、llms.txt 和 llms-full.txt 位于域名根目录,而非 /docs 下。如果代理只转发 /docs、/_next 和 /_jd,这些文件将留给您自己的网站处理,或者会缺失。这会破坏 AI 代理的发现机制并影响 SEO。

为这四个路径分别添加与 /docs 相同的 location/route 模式。以 nginx 为例:

nginx.conf
    location = /robots.txt {
        proxy_pass https://YOUR_SLUG.jamdesk.app;
        proxy_ssl_server_name on;
        proxy_set_header Host YOUR_SLUG.jamdesk.app;
        proxy_set_header X-Jamdesk-Forwarded-Host $host;
    }

    location = /sitemap.xml {
        proxy_pass https://YOUR_SLUG.jamdesk.app;
        proxy_ssl_server_name on;
        proxy_set_header Host YOUR_SLUG.jamdesk.app;
        proxy_set_header X-Jamdesk-Forwarded-Host $host;
    }

    location = /llms.txt {
        proxy_pass https://YOUR_SLUG.jamdesk.app;
        proxy_ssl_server_name on;
        proxy_set_header Host YOUR_SLUG.jamdesk.app;
        proxy_set_header X-Jamdesk-Forwarded-Host $host;
    }

    location = /llms-full.txt {
        proxy_pass https://YOUR_SLUG.jamdesk.app;
        proxy_ssl_server_name on;
        proxy_set_header Host YOUR_SLUG.jamdesk.app;
        proxy_set_header X-Jamdesk-Forwarded-Host $host;
    }

对于 Apache、Caddy、Traefik 或 HAProxy,复制您的 /docs 块,并为每个路径重复一次。保持相同的请求头和上游地址。

仅当 Jamdesk 拥有您的域名根目录时才转发这些文件。如果您的主站已提供自己的 robots.txt 或 sitemap.xml,请合并两者,而不是用一个覆盖另一个。

必需标头

在任何代理上设置这些请求头:

请求头值用途
HostYOUR_SLUG.jamdesk.app标识发往 Jamdesk 的请求
X-Forwarded-Host您的域名告诉 Jamdesk 在 URL 中使用哪个域名
X-Forwarded-Protohttps确保安全 URL 的生成
X-Jamdesk-Forwarded-Host您的域名域名验证所必需
?jd_proxy=1 查询标记附加到上游 URL请求头的替代方案,适用于只能重写 URL、无法设置请求头的工具。参见 仅自定义域名

X-Jamdesk-Forwarded-Host 请求头(或 ?jd_proxy=1 标记)是必需的。两者都缺失会静默失败。

请求仍会成功,也不会报错。以下情况会出错:

  • 仪表板中未注册自定义域名:Jamdesk 会在您的页面中提供 <meta name="robots" content="noindex">。规范链接、Open Graph 和站点地图 URL 指向 YOUR_SLUG.jamdesk.app 而非您的域名。搜索引擎将永远不会索引您的文档。
  • 已注册自定义域名:Jamdesk 会回退到已记录的域名,您的 URL 保持正确。但 Jamdesk 仍无法区分代理流量与直接访问您的 *.jamdesk.app 子域名的流量。仅自定义域名 预检将失败。

403 表示请求头存在,但指定的域名未在此项目中注册并激活。

代理配置是一次性设置。在 Jamdesk 仪表板中更改自定义域名或配置无需更新代理。Jamdesk 根据您的仪表板设置在服务器端做出路由决策。

故障排除

验证代理能否通过 HTTPS 访问 YOUR_SLUG.jamdesk.app。检查防火墙规则和 DNS 解析。

为上游连接启用 SSL/TLS。对于 nginx,添加 proxy_ssl_server_name on;。对于 Apache,启用 SSLProxyEngine On。

检查 X-Forwarded-Host 请求头。Jamdesk 用它来构建资源 URL 和内部链接。

检查您的代理是否在跟随重定向。它应当原样转发响应。

看到"Domain is not authorized to serve this content"?请按以下步骤检查:

  1. 验证您的域名已在 Jamdesk 仪表板中注册
  2. 完成域名的 DNS 验证(TXT 记录)
  3. 在代理配置中设置 X-Jamdesk-Forwarded-Host 请求头
  4. 检查您的域名是否映射到正确的项目

代理提供文档服务前,域名必须已通过验证。

预检会访问您线上域名上的 /_jd/preflight,并检查到达 Jamdesk 的请求。"未标识自身"表示有请求到达 Jamdesk 时缺少请求头或标记。请逐一检查上面每个 location/route 块中的 X-Jamdesk-Forwarded-Host 行。各预检消息的含义参见 仅自定义域名。

下一步

仅自定义域名

阻止您的子域名直接响应

自定义域名

验证 DNS 并排查故障

子路径托管

在 /docs 提供文档服务