# DNS, SSL et HTTPS (MG-123)

---

## 1. Zone DNS

Espace client OVH → *Noms de domaine* → votre domaine → onglet **Zone DNS**.

### Enregistrements pour le site

| Type | Sous-domaine | Cible | Rôle |
|---|---|---|---|
| A | (vide) | IP de l'hébergement | `maud-gaquere.fr` |
| CNAME | `www` | `maud-gaquere.fr.` | `www.maud-gaquere.fr` |

L'IP de l'hébergement se trouve dans *Hébergements* → *Informations générales*.

> Le point final de `maud-gaquere.fr.` dans le CNAME n'est pas une coquille :
> il indique un nom absolu. Sans lui, certains serveurs concatènent le domaine
> et produisent `maud-gaquere.fr.maud-gaquere.fr`.

### Enregistrements pour les e-mails

Voir `infra/EMAILS_OVH_GUIDE.md` : MX, SPF, DKIM et DMARC. Les oublier, c'est
voir les accusés de réception du formulaire partir en indésirables.

### Propagation

Compter **jusqu'à 24 h**, généralement moins d'une heure. Vérifier :

```bash
dig +short maud-gaquere.fr
dig +short www.maud-gaquere.fr
```

ou <https://www.whatsmydns.net>.

---

## 2. Choisir la forme canonique

Il faut choisir entre `maud-gaquere.fr` et `www.maud-gaquere.fr`, et rediriger
l'autre. Servir les deux sans redirection crée du contenu dupliqué et disperse
le référencement.

Recommandation : **avec `www`**, plus souple si un service tiers doit un jour
être branché sur le domaine racine.

Une fois le choix fait, décommenter le bloc correspondant dans
`public/.htaccess` (section « Un seul domaine canonique ») et ajuster
`DEFAULT_URI` dans `.env.prod.local` ainsi que la ligne `Sitemap:` de
`public/robots.txt`.

---

## 3. Certificat SSL

OVH fournit un certificat **Let's Encrypt gratuit** sur les hébergements mutualisés.

Espace client → *Hébergements* → onglet *Multisite* → à droite du domaine,
`…` → **Modifier** → cocher **SSL**.

Puis *Informations générales* → **Commander un certificat SSL** → *Let's Encrypt*.

Délai : de quelques minutes à quelques heures. Le renouvellement est automatique.

**Le domaine doit déjà pointer vers l'hébergement** avant la commande :
Let's Encrypt valide la propriété en interrogeant le site.

---

## 4. Forcer HTTPS

La redirection est déjà en place dans `public/.htaccess` :

```apache
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

Les deux conditions sont nécessaires : le répartiteur de charge OVH termine le
TLS en amont, si bien qu'Apache ne voit pas toujours `HTTPS=on`. Se fier au seul
`%{HTTPS}` provoque une **boucle de redirection infinie**, symptôme classique
sur mutualisé.

---

## 5. Vérifications

```bash
# Redirection HTTP → HTTPS
curl -sI http://maud-gaquere.fr | head -3        # attendu : 301 vers https

# Redirection vers la forme canonique
curl -sI https://maud-gaquere.fr | head -3       # attendu : 301 vers www (ou l'inverse)

# Certificat
curl -sI https://www.maud-gaquere.fr | head -1   # attendu : 200

# Validité et date d'expiration
echo | openssl s_client -connect www.maud-gaquere.fr:443 -servername www.maud-gaquere.fr 2>/dev/null \
  | openssl x509 -noout -dates -issuer
```

Contrôles en ligne :

- <https://www.ssllabs.com/ssltest/> — viser au moins **A**
- <https://securityheaders.com> — vérifie les en-têtes du `.htaccess`

---

## 6. HSTS — après validation seulement

L'en-tête `Strict-Transport-Security` est présent mais **commenté** dans
`public/.htaccess`.

Ne l'activer qu'une fois HTTPS vérifié pendant plusieurs jours : HSTS indique
aux navigateurs de refuser toute connexion non chiffrée à ce domaine, et cette
instruction est **mémorisée pendant un an**. En cas de problème de certificat,
le site devient inaccessible et il n'existe aucun moyen de revenir en arrière
côté serveur.

---

## 7. Dépannage

| Symptôme | Cause |
|---|---|
| Boucle de redirection | condition `X-Forwarded-Proto` absente du `.htaccess` |
| « Connexion non sécurisée » | certificat non encore émis, ou domaine non pointé |
| Cadenas barré | une ressource est chargée en `http://` — chercher les URL absolues |
| Certificat pour le mauvais domaine | SSL non coché sur l'entrée multisite concernée |
| 404 sur toutes les pages | répertoire racine mal réglé (doit finir par `/public`) |
