Skip to content

Type de ressource : Route Astro (Endpoint API)
Fichier source : src/pages/api/preview.ts
Statut : Actif

Endpoint API pour activer le mode preview Sanity. Vérifie le secret de preview, pose le cookie sanity-preview, et redirige vers la page demandée. Utilisé par le Sanity Studio pour prévisualiser les drafts.

  • Activer le mode preview pour visualiser les drafts Sanity
  • SĂ©curiser l’accĂšs via un secret
  • ProtĂ©ger contre les redirections ouvertes (open-redirect)
  • Rediriger vers la page demandĂ©e
Propriété Valeur
URL publique /api/preview
Mode de rendu SSR
Type Endpoint API (Redirect)
Méthode HTTP GET
Authentification requise Secret de preview
Cache No-store
[RequĂȘte Sanity Studio]
│ ‱ secret + slug
▌
[Endpoint /api/preview]
│ ‱ VĂ©rification du secret
│ ‱ Sanitization du slug (open-redirect protection)
│ ‱ Pose du cookie sanity-preview
▌
[Redirect (307)]
│
▌
[Page demandée (ex: /welcome)]
│ ‱ DĂ©tection du cookie
▌
[Rendu avec perspective previewDrafts]
Composant RĂŽle Couche
api/preview.ts DĂ©finition de l’endpoint L2 (Astro)
Sanity Studio Déclencheur du preview L1 (Sanity)
Pages avec preview Consommatrices du cookie L2 (Astro)
import type { APIRoute } from 'astro';
export const prerender = false;
export const GET: APIRoute = async ({ request, cookies, redirect }) => {
const url = new URL(request.url);
const secret = url.searchParams.get('secret');
const slug = url.searchParams.get('slug') || '/welcome';
const expectedSecret =
import.meta.env.SANITY_PREVIEW_SECRET ||
process.env.SANITY_PREVIEW_SECRET ||
'';
// Vérification du secret de prévisualisation
if (!secret || secret !== expectedSecret) {
return new Response('Jeton de prévisualisation invalide ou manquant.', {
status: 401,
});
}
// Protection contre la redirection ouverte (open-redirect)
const sanitizedSlug =
slug.startsWith('/') && !slug.startsWith('//') ? slug : '/welcome';
// Pose du cookie de preview
cookies.set('sanity-preview', 'true', {
path: '/',
httpOnly: true,
secure: true,
sameSite: 'lax',
maxAge: 3600, // 1 heure
});
return redirect(sanitizedSlug, 307);
};

Aucune requĂȘte GROQ n’est utilisĂ©e dans cet endpoint.

ParamĂštre Type Obligatoire Description Validation
secret string ✅ Secret de preview Doit correspondre à SANITY_PREVIEW_SECRET
slug string ❌ Page à afficher Sanitization contre open-redirect
Code HTTP Condition Réponse
307 SuccĂšs Redirect vers le slug
401 Secret invalide ou manquant Message d’erreur
Mode Cache-Control Rationale
API (redirect) Non configurĂ© À configurer (no-store recommandĂ©)

Non implémenté - pas de headers de cache explicites.

Non applicable (endpoint API).

Aucun composant UI n’est utilisĂ© (endpoint API).

Condition Comportement
Secret valide Activation du preview et redirect
Secret invalide Erreur 401
  • ✅ Validation du secret de preview
  • ✅ Sanitization du slug contre open-redirect
  • ✅ Cookie httpOnly et secure

Non implémenté dans cet endpoint (à configurer via Middleware Cloudflare).

SymptĂŽme Cause probable Solution
Erreur 401 Secret invalide Vérifier SANITY_PREVIEW_SECRET
Redirect incorrect Slug mal formé Vérifier la sanitization du slug
Cookie non posé Erreur de configuration Vérifier les options du cookie
Terminal window
# Logs de développement
npm run dev
# Logs Cloudflare (production)
wrangler tail
Terminal window
# Test de l'endpoint en local
curl "http://localhost:4321/api/preview?secret=YOUR_SECRET&slug=/welcome"
# Test avec secret invalide
curl "http://localhost:4321/api/preview?secret=INVALID&slug=/welcome"
# Attendu : 401
  • ✅ Validation stricte du secret
  • ✅ Protection contre open-redirect
  • ✅ Cookie sĂ©curisĂ© (httpOnly, secure, sameSite)
  • ✅ TTL limitĂ© (1 heure)
  • ✅ Redirect 307 (temporary)
  • ✅ Pas de traitement lourd
  • ✅ Rotation rĂ©guliĂšre du secret de preview
  • ✅ VĂ©rifier la configuration du sanity.config.ts
  • Configuration des headers de cache (no-store)
  • Logging des activations de preview
  • ❌ Headers de cache non configurĂ©s
  • ❌ Pas de logging des activations
  • Documentation Astro : Endpoints
  • Documentation Sanity : Preview Content
  • Fichiers concernĂ©s :
    • src/pages/api/preview.ts
    • apps/studio/sanity.config.ts (productionUrl)
    • .env (SANITY_PREVIEW_SECRET)
Date Version Description Auteur
2026-09-15 1.0 Création initiale Devin
Edit page

Last updated: