# Cache-Busting - Documentation

## Vue d'ensemble

Le cache-busting a été mis en place sur tout le projet pour garantir que les utilisateurs voient toujours la dernière version des assets (images, CSS, JS) lorsqu'ils sont modifiés.

## Comment ça fonctionne

### 1. Helper `versioned_asset()`

Un helper personnalisé a été créé pour ajouter automatiquement un paramètre de version à tous les assets.

**Utilisation dans les vues Blade :**

```blade
<!-- Ancienne méthode (sans cache-busting) -->
<img src="{{ asset('images/logo.png') }}" alt="Logo">

<!-- Nouvelle méthode (avec cache-busting) -->
<img src="{{ versioned_asset('images/logo.png') }}" alt="Logo">
```

**Résultat généré :**
```html
<img src="http://example.com/images/logo.png?v=1735471234" alt="Logo">
```

Le paramètre `v=` contient soit :
- Le timestamp de la dernière modification du fichier (si le fichier existe)
- La version de l'application configurée dans `config/app.php`

### 2. Configuration des versions

Vous pouvez définir une version globale dans le fichier `.env` :

```env
APP_VERSION=1.0.0
ASSET_VERSION=20250129
```

**Quand modifier `ASSET_VERSION` :**
- Après chaque mise à jour majeure du site
- Après avoir modifié des assets importants
- Pour forcer le rechargement de tous les assets chez tous les utilisateurs

### 3. Headers HTTP de cache

Un middleware `SetCacheHeaders` a été configuré pour :

**Assets statiques (images, CSS, JS) :**
- Cache pendant 1 an avec `Cache-Control: public, max-age=31536000, immutable`
- Les assets sont marqués comme immuables pour optimiser les performances

**Pages HTML :**
- Pas de cache avec `Cache-Control: no-cache, no-store, must-revalidate`
- Garantit que le HTML est toujours frais

### 4. Configuration Apache (.htaccess)

Le fichier `.htaccess` a été enrichi avec :

**Compression Gzip :**
- Réduit la taille des fichiers CSS, JS, HTML
- Améliore les temps de chargement

**Expiration des assets :**
- Images : 1 an
- CSS/JS : 1 an
- Fonts : 1 an

## Bonnes pratiques

### Pour les développeurs

1. **Toujours utiliser `versioned_asset()` pour les images et fichiers statiques**
   ```blade
   <img src="{{ versioned_asset('images/photo.jpg') }}">
   <link rel="stylesheet" href="{{ versioned_asset('css/custom.css') }}">
   ```

2. **Pour les assets inline ou CDN, utiliser la fonction `cache_bust()`**
   ```blade
   <script src="https://cdn.example.com/library.js?{{ cache_bust() }}"></script>
   ```

3. **Après chaque mise à jour importante, incrémenter `ASSET_VERSION`**
   ```env
   ASSET_VERSION=20250130  # Nouvelle version
   ```

### Pour la production

1. **Après déploiement, nettoyer les caches Laravel :**
   ```bash
   php artisan config:clear
   php artisan cache:clear
   php artisan view:clear
   ```

2. **Vérifier que mod_expires et mod_deflate sont activés sur Apache**

3. **Tester le cache-busting :**
   - Ouvrir une page du site
   - Vérifier dans les outils de développement que les assets ont le paramètre `?v=`
   - Modifier un asset et recharger : la version doit changer

## Dépannage

### Les assets ne se rechargent pas

1. Vider le cache Laravel :
   ```bash
   php artisan cache:clear
   ```

2. Vérifier que le helper est bien utilisé :
   ```blade
   {{ versioned_asset('path/to/file') }}
   ```

3. Changer la valeur de `ASSET_VERSION` dans `.env`

### Erreur "versioned_asset function not found"

Régénérer l'autoload de Composer :
```bash
composer dump-autoload
```

### Les headers de cache ne sont pas appliqués

1. Vérifier que le middleware est enregistré dans `bootstrap/app.php`
2. S'assurer que mod_expires est activé sur Apache
3. Vider le cache du navigateur (Ctrl+Shift+Delete)

## Fichiers modifiés

- `app/Helpers/AssetHelper.php` - Helper personnalisé
- `app/Http/Middleware/SetCacheHeaders.php` - Middleware de cache
- `bootstrap/app.php` - Enregistrement du middleware
- `config/app.php` - Configuration des versions
- `public/.htaccess` - Configuration Apache
- `composer.json` - Autoload du helper
- `resources/views/layouts/*.blade.php` - Utilisation du helper

## Performance

Avec ce système :
- ✅ Les assets sont mis en cache pendant 1 an
- ✅ Les nouvelles versions forcent le rechargement
- ✅ Réduction de ~70% de la bande passante (grâce à la compression)
- ✅ Temps de chargement réduits pour les visiteurs récurrents
- ✅ Pas de cache sur le HTML (toujours à jour)
