# Diagnostic — images non affichées via http://tlt.test

Date : 21 juillet 2026. Fait suite à un premier correctif incomplet (config `filesystems.php`
uniquement), insuffisant car il ne couvrait pas la cause principale ci-dessous.

## Cause racine exacte

Le virtual host Apache généré par Laragon pour `tlt.test` pointait son `DocumentRoot` vers la
**racine du projet** (`D:/laragon/www/tlt`) au lieu du dossier public de Laravel
(`D:/laragon/www/tlt/public`). Ce fichier avait été généré automatiquement par Laragon le
30 juin 2026, **avant** que ce projet ne soit une application Laravel (à cette date, le dossier ne
contenait que `images/` et `.agents/`), et n'avait jamais été régénéré depuis.

Conséquence : `http://tlt.test/` ne passait jamais par `public/index.php` et donc jamais par
Laravel. Apache servait un **listing brut du répertoire racine du projet** (`mod_autoindex`),
exposant au passage `.env`, `.git/`, `composer.json`, etc. Ce n'était pas seulement un problème
d'images : le site entier n'était jamais réellement rendu par Laravel via ce domaine.

Le correctif précédent (URLs relatives dans `config/filesystems.php`) était nécessaire mais ne
pouvait pas, à lui seul, corriger un `DocumentRoot` erroné au niveau du serveur web.

## Fichier responsable

`D:\laragon\etc\apache2\sites-enabled\auto.tlt.test.conf`

Avant :
```apache
DocumentRoot "D:/laragon/www/tlt"
<Directory "D:/laragon/www/tlt">
```

Après :
```apache
DocumentRoot "D:/laragon/www/tlt/public"
<Directory "D:/laragon/www/tlt/public">
```

## Commandes exécutées

```powershell
# Test de syntaxe avant application
D:\laragon\bin\apache\httpd-2.4.62-240904-win64-VS17\bin\httpd.exe -t
# -> Syntax OK

# Laragon ne gère pas Apache comme un service Windows nomme ("Apache2.4"),
# donc `httpd -k restart` echoue. Redemarrage manuel des deux processus :
Stop-Process -Id 23472 -Force
Stop-Process -Id 25840 -Force
Start-Process -FilePath "D:\laragon\bin\apache\httpd-2.4.62-240904-win64-VS17\bin\httpd.exe" `
  -ArgumentList '-d "D:/laragon/bin/apache/httpd-2.4.62-240904-win64-VS17"' -WindowStyle Hidden
```

Puis nettoyage des caches applicatifs et reconstruction des assets :
```bash
php artisan optimize:clear
php artisan view:clear
php artisan config:clear
php artisan route:clear
npm run build
```

## Fichiers modifiés dans ce correctif

- `D:\laragon\etc\apache2\sites-enabled\auto.tlt.test.conf` (DocumentRoot corrigé) — **hors du
  dépôt git du projet**, propre à cette machine Laragon.
- (Correctif précédent, conservé) `config/filesystems.php`, `resources/views/components/layout.blade.php`,
  `resources/views/home.blade.php`.

## Vérifications physiques, niveau par niveau

| # | Niveau | Résultat |
|---|---|---|
| 1 | Fichier original | `images/tenge_images/TLT_2025_web.jpg` présent (1,9 Mo, lisible). |
| 2 | Variante optimisée | `storage/app/public/media/large/img-05109.jpg` : 71 544 octets, décodé avec succès par `getimagesize()` → 1600×767, `image/jpeg`. |
| 3 | Chemin en base | `media_items.file = images/tenge_images/TLT_2025_web.jpg` (aucune anomalie détectée sur 10 échantillons aléatoires + recherche de patterns : 0 backslash, 0 `/storage` en dur, 0 `tlt.test` en dur, 0 `media/media`). |
| 4 | Disque Laravel | `config/filesystems.php` → disque `public`, URL relative `/storage`. |
| 5 | Lien `public/storage` | Jonction Windows (`Junction`) confirmée vers `D:\laragon\www\tlt\storage\app\public` (`Get-Item` → `LinkType: Junction`). Fichier accessible à travers la jonction (`Test-Path` → `True`). |
| 6 | Virtual host Laragon | **Cause racine — corrigé** : `DocumentRoot` pointait sur le projet entier au lieu de `public/`. |
| 7 | URL générée | `/storage/media/large/img-05109.jpg` (relative, plus de domaine codé en dur). |
| 8 | Réponse HTTP réelle | Voir tableau ci-dessous. |
| 9 | Rendu navigateur | Voir section « Vérification visuelle ». |
| 10 | CSS/JS | Aucune règle `display:none` / `visibility:hidden` / `opacity:0` n'affecte les images de contenu (seul un calque de légende au survol utilise `opacity-0`→`opacity-100`, sans impact sur l'image elle-même). Le chargement différé utilise l'attribut natif `loading="lazy"`, sans dépendance JavaScript : les images restent visibles même sans JS. La modale « lightbox » a un `src=""` par défaut **par conception** (elle n'est peuplée qu'au clic sur une vignette) — ce n'est pas une image de contenu. |

## Tests HTTP réels (après correctif, avant nettoyage de la route de diagnostic)

| URL testée | Statut | Content-Type | Taille | Décodage réel |
|---|---|---|---|---|
| `http://tlt.test/` (avant correctif) | 200 | `text/html` | 1591 o | **Listing de répertoire**, pas Laravel |
| `http://tlt.test/.env` (avant correctif) | 200 (listé, accessible) | — | — | Fichier `.env` exposé publiquement |
| `http://tlt.test/` (après correctif) | 200 | `text/html; charset=utf-8` | 39 601 o | Page Laravel réelle (`<title>Te Litho Tenge Didier...`) |
| `http://tlt.test/.env` (après correctif) | **404** | — | — | Exposition corrigée |
| `http://tlt.test/storage/media/large/img-05109.jpg` | 200 | `image/jpeg` | 71 544 o | `getimagesize()` → 1600×767 (identique à l'original stocké) |
| `http://tlt.test/storage/media/medium/img-05109.jpg` | 200 | `image/jpeg` | 30 532 o | Téléchargé et décodé avec succès |
| `http://tlt.test/storage/media/medium/img-00156.jpg` | 200 | `image/jpeg` | 99 310 o | Décodé → 576×1024 |
| `http://tlt.test/storage/media/medium/img-04510.jpg` | 200 | `image/jpeg` | 212 872 o | Décodé → 900×803 |
| `http://tlt.test/storage/media/medium/img-00700.jpg` | 200 | `image/jpeg` | 82 174 o | Décodé → 900×506 |
| `http://tlt.test/storage/media/medium/img-01421.jpg` | 200 | `image/jpeg` | 75 171 o | Décodé → 900×506 |
| `http://tlt.test/galerie` | 200 | — | — | 36 vignettes (`<picture>`) présentes sur la première page |
| `http://tlt.test/parcours` | 200 | — | — | 5 balises `<picture>` avec `src` réel |
| `http://tlt.test/actions/assainissement` | 200 | — | — | 24 balises `<picture>` avec `src` réel |

Chaque image a été **téléchargée puis réellement décodée** avec `getimagesize()` côté serveur
(dimensions correctes obtenues), et non simplement vérifiée par un code HTTP 200 — un fichier HTML
d'erreur renvoyé avec un statut 200 aurait échoué à ce décodage.

## Nombre de variantes trouvées

- `storage/app/public/media/thumb/` : 8 198 fichiers (4 099 `.jpg` + 4 099 `.webp`)
- `storage/app/public/media/medium/` : 8 198 fichiers
- `storage/app/public/media/large/` : 8 198 fichiers
- Correspond exactement aux 4 099 images publiées en base (`media_items` avec `published = true`
  et sans doublon).

## Vérification visuelle

Le panneau navigateur intégré à cet environnement affiche une **carte d'approbation par origine**
pour le domaine personnalisé `tlt.test` : la navigation fonctionne, mais les outils de lecture
(extraction de texte, console, requêtes réseau, capture d'écran) restent bloqués tant qu'une
approbation manuelle n'a pas été donnée dans l'interface — action que je ne peux pas effectuer à
la place de l'utilisateur. La vérification a donc été effectuée par téléchargement et décodage
réel des octets d'image (preuve plus stricte qu'une capture d'écran, car elle exclut la
possibilité qu'un serveur renvoie une page HTML d'erreur avec un statut 200 déguisé en image).
Une confirmation visuelle humaine, dans un navigateur classique, reste recommandée en dernière
étape.

## Effet de bord corrigé : exposition de `.env`

Le mauvais `DocumentRoot` exposait publiquement, via `http://tlt.test/`, le contenu du fichier
`.env` du projet (clé d'application, configuration base de données). Ce risque était limité à la
machine locale (domaine `.test` non routable publiquement), mais **`APP_KEY` doit être régénérée**
par précaution avant toute mise en production, et le fichier `.env` ne doit jamais être commité ni
copié tel quel vers un serveur de production accessible publiquement sans `DocumentRoot` correct.

## Autres sites Laragon vérifiés après redémarrage d'Apache

`lgal-society.test`, `riise.test`, `anamed.test` répondent tous en 200 après le redémarrage —
aucun autre projet hébergé sur cette instance Laragon n'a été affecté.

## Validation finale

- [x] `php artisan test` → 25/25 tests, 66 assertions, 0 échec.
- [x] Image directe (`/storage/media/large/img-05109.jpg`) : 200, `image/jpeg`, décodable.
- [x] Le hero de la page d'accueil affiche une image réelle (`src` non vide, fichier confirmé).
- [x] Les pages `/parcours` et `/actions/{domaine}` affichent leurs images (`<picture>` avec `src`
      réel, vérifié).
- [x] La galerie affiche 36 vignettes sur sa première page (> 20 requis).
- [x] Les marqueurs de la lightbox sont présents dans le HTML (`#lightbox`, `#lightbox-img`,
      `data-lightbox-index`) ; son ouverture dépend du JavaScript client (`resources/js/app.js`),
      non vérifiable sans confirmation visuelle humaine.
- [x] Aucune image ne dépend d'un domaine codé en dur (URLs relatives partout).
- [x] Le lien `public/storage` est une jonction Windows valide et fonctionnelle.
- [ ] Vérification visuelle humaine dans un navigateur standard — **recommandée en complément**,
      non réalisable depuis cet environnement pour ce domaine spécifique.
