Débloque le chantier d'isolation admin (G15). ADM-R2 : la suppression admin annule désormais l'abonnement Stripe avant d'effacer le compte, sans bloquer sur un échec fournisseur (journalisé). ADM-R3 : premium_active_clause() remplace is_premium brut dans les comptages/filtres admin. Ajoute admin_audit_log (sans FK), la limitation de débit sur /api/admin, le refus de démarrage sous 32 caractères pour ADMIN_TOKEN, les en-têtes Caddy dédiés, et la segmentation locale sur growth_events (migrations 0034/0035). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
59 lines
3.2 KiB
Text
59 lines
3.2 KiB
Text
tondomaine.com {
|
||
encode zstd gzip
|
||
# Défense en profondeur : mêmes politiques que l’API, appliquées aussi au SPA.
|
||
header {
|
||
Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||
X-Content-Type-Options "nosniff"
|
||
X-Frame-Options "DENY"
|
||
Referrer-Policy "strict-origin-when-cross-origin"
|
||
Permissions-Policy "camera=(), geolocation=(), microphone=()"
|
||
Content-Security-Policy "default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self' https://js.stripe.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https://api.stripe.com https://r.stripe.com; frame-src https://js.stripe.com https://hooks.stripe.com; upgrade-insecure-requests"
|
||
}
|
||
|
||
# Le sitemap est généré par l'API (pages statiques + landing pages), pas servi en statique.
|
||
handle /sitemap.xml {
|
||
reverse_proxy kankwa-api:8000
|
||
}
|
||
|
||
handle /api/* {
|
||
reverse_proxy kankwa-api:8000
|
||
}
|
||
|
||
# Anciens slugs indexés : 301 réelle plutôt que la redirection React côté client
|
||
# (un <Navigate> renvoie un 200 puis change d'URL en JS — Google ne transfère
|
||
# pas le jus de lien et garde les deux URLs en base). App.tsx garde les mêmes
|
||
# redirections en secours ; c'est celle-ci qui compte pour le référencement.
|
||
# Le blog a été remplacé par les clusters d'acquisition : chaque article part
|
||
# vers la landing qui a repris son intention.
|
||
redir /blog / permanent
|
||
redir /alternative-doodle-gratuite-sans-compte /outils/sondage-date permanent
|
||
redir /alternative-doodle-gratuite-sans-pub /outils/sondage-date permanent
|
||
redir /sondage-disponibilite-gratuit-sans-pub /outils/sondage-date permanent
|
||
redir /organiser-week-end-entre-amis /organiser/week-end-entre-amis permanent
|
||
redir /cadeau-commun-partage-frais-sans-commission /organiser/cadeau-commun permanent
|
||
redir /qui-apporte-quoi-fete-ecole /organiser/fete-ecole permanent
|
||
# Slugs anglais (kankwa.com) — à déclarer dans le bloc du domaine anglais.
|
||
redir /free-availability-poll-no-ads /tools/date-poll permanent
|
||
redir /plan-a-weekend-with-friends /plan/weekend-with-friends permanent
|
||
redir /group-gift-expense-sharing-no-fee /plan/group-gift permanent
|
||
redir /who-brings-what-school-party /plan/school-party permanent
|
||
|
||
# Pages privées accessibles par lien : jamais indexées, y compris par les
|
||
# crawlers qui n'exécutent pas le JS (le noindex côté React ne les couvre pas).
|
||
@private path /share/* /cancel/* /hub/p/* /kontrib/* /kount/* /join /compte* /admin*
|
||
header @private X-Robots-Tag "noindex, nofollow"
|
||
|
||
# Interface admin (ADM-00) : au-delà des politiques globales ci-dessus,
|
||
# aucun referrer ne doit fuiter vers un tiers embarqué (Recharts/nivo/day-picker
|
||
# ne chargent rien d'externe, mais l'outil reste un point d'entrée sensible).
|
||
@admin path /admin*
|
||
header @admin {
|
||
X-Frame-Options "DENY"
|
||
X-Content-Type-Options "nosniff"
|
||
Referrer-Policy "no-referrer"
|
||
}
|
||
|
||
handle {
|
||
reverse_proxy kankwa-frontend:3001
|
||
}
|
||
}
|