# ---------------------------------------------------------------
# .htaccess — media.moiseissure.ch
# -----------------------------------------------------------
# À placer à la racine du dossier servi par media.moiseissure.ch.
#
# Rôle : autoriser les sites de la famille moiseissure.ch (le
# domaine principal et n'importe lequel de ses sous-domaines —
# moisireseau.infra, boards, library, roms, science, upload.*, etc.)
# à accéder en JavaScript aux ressources hébergées ici (fetch/XHR,
# une police @font-face, un <canvas> avec crossorigin).
#
# Une balise <img>, <video> ou <link rel="icon"> n'a PAS besoin de
# CORS pour s'afficher : ces en-têtes ne changent rien à l'icône du
# site ni à la vidéo du hero, qui fonctionnent déjà sans ce fichier.
# Ils deviennent nécessaires le jour où un script JS doit LIRE la
# réponse (desktop-version.json via fetch(), par exemple) plutôt que
# se contenter de l'afficher — c'est déjà le cas pour l'application
# de bureau, mais elle interroge ce fichier depuis le processus
# principal d'Electron, hors du navigateur, donc hors de portée du
# CORS : ce .htaccess sert aux futurs usages faits depuis les pages
# web elles-mêmes.
#
# Toute autre origine (un site tiers, par exemple) reste refusée :
# aucun en-tête CORS ne lui est envoyé, comportement par défaut.
# ---------------------------------------------------------------

<IfModule mod_setenvif.c>
    # $1 = l'Origin entier si (et seulement si) il correspond à
    # moiseissure.ch ou l'un de ses sous-domaines, quel que soit le
    # niveau d'imbrication (upload.plus.moiseissure.ch compris).
    SetEnvIf Origin "^(https?://([a-z0-9-]+\.)*moiseissure\.ch)$" CORS_ORIGIN=$1
</IfModule>

<IfModule mod_headers.c>
    # "always" : envoyé même sur une réponse d'erreur (404, etc.),
    # pour qu'un script JS distingue "fichier absent" d'un simple
    # refus CORS opaque.
    Header always set Access-Control-Allow-Origin "%{CORS_ORIGIN}e" env=CORS_ORIGIN

    # La réponse dépend de l'en-tête Origin reçu : indispensable pour
    # qu'un cache (navigateur, CDN) ne serve pas à un site la réponse
    # calculée pour un autre.
    Header always append Vary "Origin"

    # Hébergement en lecture seule : pas besoin de POST/PUT ici.
    Header always set Access-Control-Allow-Methods "GET, HEAD, OPTIONS"

    # Range : nécessaire si la vidéo est un jour lue via fetch()
    # plutôt que directement par la balise <video>.
    Header always set Access-Control-Allow-Headers "Range, Content-Type"
    Header always set Access-Control-Expose-Headers "Content-Length, Content-Range, Accept-Ranges"

    # Évite de renégocier le préflight à chaque requête (24 h).
    Header always set Access-Control-Max-Age "86400"
</IfModule>
