Jamdesk Documentation logo

Vercel

Scopri due modi per servire la documentazione Jamdesk su /docs del tuo dominio distribuito su Vercel: riscritture in vercel.json oppure Edge Middleware.

Servi la tua documentazione Jamdesk su /docs nel tuo dominio distribuito su Vercel. Scegli una delle due configurazioni. Producono lo stesso risultato.

Prerequisiti

  • Un progetto distribuito su Vercel
  • Il tuo sottodominio Jamdesk (disponibile nelle impostazioni della dashboard), con Host at a subpath abilitato
  • Il tuo dominio personalizzato registrato e verificato nella dashboard

Opzione A: rewrite in vercel.json

Usi un sottopercorso personalizzato al posto del predefinito /docs? Sostituisci ogni /docs negli snippet seguenti con il tuo sottopercorso, nei campi source e destination di ogni regola. Riesegui il deploy dopo aver rinominato il sottopercorso nella dashboard. Nessuno rigenera questo file al posto tuo.

Una riscrittura può cambiare la destinazione di una richiesta, ma non può aggiungere un header di richiesta. Per questo ogni destinazione include un marcatore pubblico, ?jd_proxy=1. Il marcatore indica a Jamdesk che la richiesta è passata dal tuo proxy. Jamdesk lo rimuove prima del rendering, quindi i tuoi visitatori non lo vedono mai.

Crea o modifica vercel.json nella radice del progetto, sostituendo YOUR_SLUG con il tuo sottodominio Jamdesk:

vercel.json
{
  "rewrites": [
    { "source": "/docs", "destination": "https://YOUR_SLUG.jamdesk.app/docs?jd_proxy=1" },
    { "source": "/docs/:path*", "destination": "https://YOUR_SLUG.jamdesk.app/docs/:path*?jd_proxy=1" },
    { "source": "/_next/:path*", "destination": "https://YOUR_SLUG.jamdesk.app/_next/:path*" },
    { "source": "/_jd/:path*", "destination": "https://YOUR_SLUG.jamdesk.app/_jd/:path*?jd_proxy=1" }
  ]
}

/_next/:path* non richiede il marcatore. È un percorso di asset statici che Jamdesk non filtra mai. Un sito che non è un'app Next.js non ha file propri in /_next/: ogni richiesta sotto quel percorso ricade su Jamdesk.

Le stesse quattro regole funzionano in next.config.js per i progetti Next.js:

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  async rewrites() {
    return [
      { source: "/docs", destination: "https://YOUR_SLUG.jamdesk.app/docs?jd_proxy=1" },
      { source: "/docs/:path*", destination: "https://YOUR_SLUG.jamdesk.app/docs/:path*?jd_proxy=1" },
      { source: "/_next/:path*", destination: "https://YOUR_SLUG.jamdesk.app/_next/:path*" },
      { source: "/_jd/:path*", destination: "https://YOUR_SLUG.jamdesk.app/_jd/:path*?jd_proxy=1" },
    ];
  },
};

export default nextConfig;

Inoltra anche i file nella radice

robots.txt, sitemap.xml, llms.txt e llms-full.txt si trovano nella radice del dominio, al di fuori di /docs. Motori di ricerca e agenti AI ne hanno bisogno per trovare la tua documentazione. Se Jamdesk gestisce la radice del tuo dominio, aggiungi altre quattro regole:

vercel.json
{
  "rewrites": [
    { "source": "/robots.txt", "destination": "https://YOUR_SLUG.jamdesk.app/robots.txt?jd_proxy=1" },
    { "source": "/sitemap.xml", "destination": "https://YOUR_SLUG.jamdesk.app/sitemap.xml?jd_proxy=1" },
    { "source": "/llms.txt", "destination": "https://YOUR_SLUG.jamdesk.app/llms.txt?jd_proxy=1" },
    { "source": "/llms-full.txt", "destination": "https://YOUR_SLUG.jamdesk.app/llms-full.txt?jd_proxy=1" }
  ]
}

Se il tuo sito marketing serve già un proprio robots.txt o sitemap.xml alla radice, unisci i due file invece di sovrascriverne uno con l'altro.

Esegui il deploy e verifica

Esegui il deploy con vercel --prod (o fai push sul repository Git collegato). Apri https://yoursite.com/docs e visualizza il sorgente della pagina. Controlla due cose:

  1. <link rel="canonical"> punta al tuo dominio, non a YOUR_SLUG.jamdesk.app
  2. Non c'è <meta name="robots" content="noindex">

Se una delle due è sbagliata, a una riscrittura manca il marcatore ?jd_proxy=1. Vedi Perché il marcatore è importante.

Opzione B: Edge Middleware

Imposta l'header di richiesta X-Jamdesk-Forwarded-Host nel tuo Edge Middleware, invece di usare il marcatore. I due segnali sono equivalenti. Scegli questa opzione se vuoi mantenere la logica di routing nel codice che già gestisci.

Crea un file middleware.ts nella radice del progetto. Sostituisci YOUR_SLUG con il tuo sottodominio Jamdesk:

middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

const JAMDESK_HOST = 'YOUR_SLUG.jamdesk.app';

export function middleware(request: NextRequest) {
  const url = request.nextUrl;
  const destination = new URL(url.pathname + url.search, `https://${JAMDESK_HOST}`);

  // Clone headers and tell Jamdesk which domain the visitor actually used.
  const headers = new Headers(request.headers);
  headers.set('X-Jamdesk-Forwarded-Host', url.hostname);

  return NextResponse.rewrite(destination, {
    request: { headers },
  });
}

export const config = {
  matcher: ['/docs', '/docs/:path*', '/_jd/:path*'],
};

Con un sottopercorso personalizzato, sostituisci /docs e /docs/:path* nel matcher qui sopra con il tuo sottopercorso configurato.

Non aggiungere /_next/:path* al matcher. Il middleware viene eseguito prima del controllo del filesystem di Vercel. Se corrisponde a /_next/, il JavaScript e i CSS del tuo sito verrebbero inviati a Jamdesk e i tuoi stili si romperebbero. Il passaggio successivo instrada /_next/ in modo sicuro.

Chiama il file middleware.ts ed esporta una funzione chiamata middleware. Next.js 16 suggerisce di rinominarlo in proxy.ts. In produzione Vercel non invoca ancora proxy.ts: rinominarlo disabiliterebbe il middleware senza avvisi.

Instrada le risorse e i file nella radice in vercel.json

Le pagine di Jamdesk caricano i propri bundle da /_next/. File della radice come robots.txt si trovano fuori dal matcher sopra. Instradali entrambi con delle riscritture. Le riscritture vengono eseguite dopo il controllo del filesystem: vincono gli output di build del tuo sito, e solo le richieste che il tuo sito non può servire ricadono su Jamdesk:

vercel.json
{
  "rewrites": [
    { "source": "/_next/:path*", "destination": "https://YOUR_SLUG.jamdesk.app/_next/:path*" },
    { "source": "/robots.txt", "destination": "https://YOUR_SLUG.jamdesk.app/robots.txt?jd_proxy=1" },
    { "source": "/sitemap.xml", "destination": "https://YOUR_SLUG.jamdesk.app/sitemap.xml?jd_proxy=1" },
    { "source": "/llms.txt", "destination": "https://YOUR_SLUG.jamdesk.app/llms.txt?jd_proxy=1" },
    { "source": "/llms-full.txt", "destination": "https://YOUR_SLUG.jamdesk.app/llms-full.txt?jd_proxy=1" }
  ]
}

I file della radice includono ?jd_proxy=1. Il middleware non viene eseguito su di essi e una riscrittura non può impostare l'header. Aggiungili solo se Jamdesk gestisce la radice del tuo dominio. Se il tuo sito serve un proprio robots.txt o sitemap.xml, uniscili invece di sostituirli.

Esegui il deploy e verifica

Esegui il deploy con vercel --prod (o fai push sul repository Git collegato). Apri https://yoursite.com/docs e visualizza il sorgente della pagina. Controlla due cose:

  1. <link rel="canonical"> punta al tuo dominio, non a YOUR_SLUG.jamdesk.app
  2. Non c'è <meta name="robots" content="noindex">

Se una delle due è sbagliata, l'header X-Jamdesk-Forwarded-Host non sta raggiungendo Jamdesk. Verifica che /docs sia nel matcher.

Perché il marker è importante

Jamdesk ha bisogno di un segnale che indichi che una richiesta è arrivata tramite il tuo proxy, e non come accesso diretto al tuo sottodominio *.jamdesk.app. Il marcatore ?jd_proxy=1 e l'header X-Jamdesk-Forwarded-Host trasportano questo segnale. Jamdesk li tratta come equivalenti. Entrambi fanno tre cose:

  • Confermano il tuo dominio registrato
  • Fanno puntare canonical, Open Graph e link della sitemap a quel dominio
  • Permettono a Solo dominio personalizzato di distinguere il traffico proxy dagli accessi diretti

Se manca il segnale, il problema passa inosservato. Le pagine vengono comunque renderizzate. Senza un dominio personalizzato registrato, portano noindex e canonical del sottodominio. Con un dominio personalizzato registrato, il controllo di Solo dominio personalizzato fallisce. Un 403 significa che il segnale è presente ma indica un dominio non registrato e attivo per questo progetto.

Risoluzione dei problemi

Probabilmente il tuo matcher include /_next/:path*. Il middleware viene eseguito prima del controllo del filesystem e instrada gli asset della tua applicazione verso Jamdesk. Rimuovi /_next/ dal matcher e instradalo tramite vercel.json. Vedi Opzione B.

Visualizza il sorgente della pagina su https://yoursite.com/docs. Un tag <meta name="robots" content="noindex"> significa che né il marcatore né l'header stanno raggiungendo Jamdesk. Con l'Opzione A, verifica che ogni destinazione di riscrittura termini con ?jd_proxy=1 (tranne /_next/:path*). Con l'Opzione B, verifica che /docs sia nel matcher del middleware. Una riscrittura di vercel.json da sola non può impostare l'header.

Il marcatore o l'header raggiunge Jamdesk, ma indica un dominio che Jamdesk non serve per questo progetto:

  1. Verifica che il dominio sia registrato nella dashboard Jamdesk
  2. Completa la verifica DNS (record TXT)
  3. Controlla che il dominio sia associato al progetto corretto e segnato come attivo
  4. Con l'Opzione B, verifica che il middleware imposti l'header con il dominio visibile al visitatore, non con un URL di anteprima

Verifica che le riscritture (o il matcher) coprano /docs e /docs/:path*. Senza il wildcard, le pagine annidate non funzionano.

Instrada /_jd/:path* e /_next/:path*. /_jd/ serve font, immagini e branding di Jamdesk. /_next/ serve i bundle della documentazione. Se manca uno dei due, il layout si rompe.

Verifica che il file si chiami middleware.ts (non proxy.ts) nella radice del progetto. Deve esportare una funzione chiamata middleware. L'avviso di deprecazione di Next.js 16 raccomanda proxy.ts, ma in produzione Vercel non viene invocato.

Verifica che l'URL di destinazione usi https:// e punti a jamdesk.app, non al tuo dominio.

Il controllo recupera /_jd/preflight sul tuo dominio live e ispeziona ciò che è arrivato a Jamdesk. "Non si identifica" significa che una riscrittura è arrivata a Jamdesk senza il marcatore o l'header. Ricontrolla ogni destinazione di riscrittura (Opzione A) o gli header del tuo middleware (Opzione B). Vedi Solo dominio personalizzato.

Qual è il prossimo passo?

Solo dominio personalizzato

Impedisci al tuo sottodominio di rispondere direttamente

Domini personalizzati

Verifica il DNS e risolvi i problemi

Hosting su sottopercorso

Servi la documentazione su /docs