Vercel
Découvrez deux façons de servir votre documentation Jamdesk sur /docs sur votre domaine déployé sur Vercel : réécritures vercel.json ou Edge Middleware.
Si votre site est déployé sur Vercel, vous pouvez diffuser votre documentation Jamdesk à l'adresse /docs sur votre propre domaine. Il existe deux façons de procéder, et les deux produisent le même résultat :
- Option A : réécritures vercel.json — sans code, fonctionne avec n'importe quel framework. La plupart des projets devraient commencer ici.
- Option B : Edge Middleware — pour les sites qui utilisent déjà Edge Middleware et souhaitent intégrer Jamdesk dans le même fichier.
Prérequis
- Un projet déployé sur Vercel
- Votre sous-domaine Jamdesk (disponible dans les paramètres du dashboard), avec l'option Héberger sur /docs activée
- Votre domaine personnalisé enregistré et vérifié dans le dashboard
Option A : réécritures vercel.json
Une réécriture peut changer la destination d'une requête, mais elle ne peut pas ajouter d'en-tête de requête — c'est pourquoi chaque destination porte à la place un marqueur public, ?jd_proxy=1, qui indique à Jamdesk que la requête est passée par votre proxy. Jamdesk le supprime avant le rendu ; vos visiteurs ne le voient jamais.
Créez ou modifiez vercel.json à la racine de votre projet, en remplaçant YOUR_SLUG par votre sous-domaine Jamdesk :
{
"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* n'a besoin d'aucun marqueur — c'est un chemin de ressources statiques que Jamdesk ne restreint jamais. Si votre site n'est pas une application Next.js, il n'a pas de fichiers /_next/ propres, donc la réécriture reste correcte : chaque requête sous ce chemin est simplement transmise à Jamdesk.
Les quatre mêmes règles fonctionnent dans next.config.js pour les projets Next.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;Transférez aussi vos fichiers racine
robots.txt, sitemap.xml, llms.txt et llms-full.txt se trouvent à la racine du domaine, en dehors de /docs — sans eux, les moteurs de recherche et les agents IA ne peuvent pas découvrir votre documentation. Si Jamdesk gère la racine de votre domaine, ajoutez quatre règles supplémentaires :
{
"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" }
]
}Si votre site marketing sert déjà son propre robots.txt ou sitemap.xml à la racine, fusionnez les deux au lieu d'écraser l'un avec l'autre.
Déployez et vérifiez
Déployez avec vercel --prod (ou effectuez un push vers votre dépôt Git connecté), puis ouvrez https://yoursite.com/docs et affichez le code source de la page. Vérifiez deux choses :
<link rel="canonical">pointe vers votre domaine, pas versYOUR_SLUG.jamdesk.app- Il n'y a aucune balise
<meta name="robots" content="noindex">
Si l'un des deux est incorrect, une réécriture n'a pas son marqueur ?jd_proxy=1 — voir Pourquoi le marqueur est important.
Option B : Edge Middleware
Si vous utilisez déjà Edge Middleware, définissez-y l'en-tête de requête X-Jamdesk-Forwarded-Host plutôt que d'utiliser le marqueur. Les deux signaux sont équivalents — choisissez cette option uniquement si vous préférez conserver la logique de routage dans du code que vous maintenez déjà.
Créez un fichier middleware.ts à la racine de votre projet, en remplaçant YOUR_SLUG par votre sous-domaine Jamdesk :
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*'],
};N'ajoutez pas /_next/:path* au matcher. Middleware s'exécute avant la vérification du système de fichiers de Vercel, donc faire correspondre /_next/ envoie le JavaScript et le CSS de votre propre site à Jamdesk et casse vos styles. L'étape suivante achemine /_next/ de manière sûre.
Le fichier doit s'appeler middleware.ts et exporter une fonction nommée middleware. Next.js 16 suggère de le renommer en proxy.ts, mais la production Vercel n'invoque pas encore proxy.ts — le renommer le désactive silencieusement.
Acheminez les ressources et les fichiers racine dans vercel.json
Les pages de Jamdesk chargent leurs bundles depuis /_next/, et les fichiers racine comme robots.txt se situent en dehors du matcher ci-dessus. Acheminez les deux avec des réécritures — les réécritures s'exécutent après la vérification du système de fichiers, donc votre propre résultat de build l'emporte toujours et seules les requêtes que votre site ne peut pas servir sont transmises à Jamdesk :
{
"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" }
]
}Les fichiers racine portent ?jd_proxy=1 car le middleware ne s'exécute pas sur eux et une réécriture ne peut pas définir l'en-tête. Ajoutez-les uniquement si Jamdesk gère la racine de votre domaine — si votre site sert son propre robots.txt ou sitemap.xml, fusionnez-les plutôt.
Déployez et vérifiez
Déployez avec vercel --prod (ou effectuez un push vers votre dépôt Git connecté), puis ouvrez https://yoursite.com/docs et affichez le code source de la page. Vérifiez deux choses :
<link rel="canonical">pointe vers votre domaine, pas versYOUR_SLUG.jamdesk.app- Il n'y a aucune balise
<meta name="robots" content="noindex">
Si l'un des deux est incorrect, l'en-tête X-Jamdesk-Forwarded-Host n'atteint pas Jamdesk — vérifiez que /docs figure dans le matcher.
Pourquoi le marqueur est important
Jamdesk a besoin d'un signal indiquant qu'une requête est arrivée via votre proxy plutôt que comme un accès direct à votre sous-domaine *.jamdesk.app. Le marqueur ?jd_proxy=1 et l'en-tête X-Jamdesk-Forwarded-Host portent tous deux ce signal, et Jamdesk les traite comme équivalents. L'un ou l'autre confirme votre domaine enregistré, fait pointer les liens canoniques, Open Graph et sitemap vers celui-ci, et permet à Domaine personnalisé uniquement de distinguer le trafic proxy des accès directs.
Un signal manquant échoue silencieusement — les pages s'affichent toujours, mais avec noindex et des canoniques de sous-domaine si aucun domaine personnalisé n'est enregistré, ou avec un échec de la vérification Domaine personnalisé uniquement si un domaine est enregistré. Une erreur 403 est le problème inverse : le signal est présent mais désigne un domaine qui n'est pas enregistré et actif pour ce projet.
Dépannage
Votre matcher inclut presque certainement /_next/:path*. Middleware s'exécute avant la vérification du système de fichiers, ce qui achemine les ressources de votre propre application vers Jamdesk. Retirez /_next/ du matcher et acheminez-le plutôt via vercel.json — voir l'option B.
Affichez le code source de la page à https://yoursite.com/docs. Si vous voyez <meta name="robots" content="noindex">, ni le marqueur ni l'en-tête n'atteint Jamdesk. Sur l'option A, vérifiez que chaque destination de réécriture se termine par ?jd_proxy=1 (sauf /_next/:path*). Sur l'option B, vérifiez que /docs figure dans le matcher du middleware — une réécriture vercel.json seule ne peut pas définir l'en-tête.
Le marqueur ou l'en-tête atteint Jamdesk, mais désigne un domaine que Jamdesk ne servira pas pour ce projet :
- Vérifiez que votre domaine est enregistré dans le dashboard Jamdesk
- Effectuez la vérification DNS (enregistrement TXT)
- Vérifiez que le domaine correspond au bon projet et qu'il est marqué comme actif
- Sur l'option B, vérifiez que le middleware définit l'en-tête sur votre domaine visible par les visiteurs, et non sur une URL de preview
Vérifiez que vos réécritures (ou votre matcher) couvrent à la fois /docs et /docs/:path*. L'omission du wildcard entraîne l'échec des pages imbriquées.
Vérifiez que /_jd/:path* et /_next/:path* sont tous deux acheminés. /_jd/ sert les polices, images et éléments de marque de Jamdesk ; /_next/ sert les bundles de la documentation. L'omission de l'un ou l'autre casse la mise en page.
Vérifiez que le fichier s'appelle middleware.ts (et non proxy.ts) à la racine de votre projet, et qu'il exporte une fonction nommée middleware. L'avertissement de dépréciation de Next.js 16 recommande proxy.ts, mais la production Vercel ne l'invoque pas.
Vérifiez que l'URL de destination utilise https:// et pointe vers jamdesk.app, et non vers votre propre domaine.
La vérification récupère /_jd/preflight sur votre domaine actif et inspecte ce qui a réellement atteint Jamdesk. Si elle indique que votre proxy « ne s'identifie pas », une réécriture a atteint Jamdesk sans le marqueur ni l'en-tête — revérifiez chaque destination de réécriture (option A) ou les en-têtes de votre middleware (option B). Voir Domaine personnalisé uniquement.
