67 lines
2.2 KiB
Markdown
67 lines
2.2 KiB
Markdown
|
|
# Piège Apache (o2switch) : « Index of /… » au lieu des pages
|
||
|
|
|
||
|
|
Symptôme : le site est déployé sur un hébergement mutualisé Apache (o2switch),
|
||
|
|
la page d'accueil s'affiche, mais **cliquer sur un lien interne affiche
|
||
|
|
« Index of /chatcontrol/quiz »** (un listing de dossier) au lieu de la page.
|
||
|
|
|
||
|
|
## Cause : conflit fichier / dossier
|
||
|
|
|
||
|
|
SvelteKit (adapter-static, `trailingSlash` par défaut = `'never'`) génère :
|
||
|
|
|
||
|
|
```
|
||
|
|
build/
|
||
|
|
├── quiz.html ← la page
|
||
|
|
├── quiz/ ← dossier créé pour __data.json
|
||
|
|
│ └── __data.json
|
||
|
|
├── outils.html
|
||
|
|
├── outils/
|
||
|
|
│ └── …
|
||
|
|
```
|
||
|
|
|
||
|
|
Quand le navigateur demande `/chatcontrol/quiz`, Apache voit qu'un **dossier**
|
||
|
|
`quiz/` existe et redirige (301) vers `/chatcontrol/quiz/`. Comme ce dossier
|
||
|
|
ne contient pas de `index.html`, Apache sert son **autoindex** (le listing).
|
||
|
|
Le fichier `quiz.html`, lui, n'est jamais trouvé.
|
||
|
|
|
||
|
|
Apache donne toujours la priorité au dossier quand les deux existent —
|
||
|
|
ce problème revient à chaque site statique posé sur du mutualisé Apache.
|
||
|
|
|
||
|
|
## Correctif (déjà appliqué dans ce dépôt)
|
||
|
|
|
||
|
|
`frontend/src/routes/+layout.ts` :
|
||
|
|
|
||
|
|
```ts
|
||
|
|
export const trailingSlash = 'always'
|
||
|
|
```
|
||
|
|
|
||
|
|
Chaque page est alors générée **dans** son dossier :
|
||
|
|
|
||
|
|
```
|
||
|
|
build/
|
||
|
|
├── quiz/
|
||
|
|
│ ├── index.html ← la page, servie par Apache
|
||
|
|
│ └── __data.json
|
||
|
|
├── outils/
|
||
|
|
│ ├── index.html
|
||
|
|
│ └── aegis/
|
||
|
|
│ └── index.html
|
||
|
|
```
|
||
|
|
|
||
|
|
Plus de conflit possible : le dossier existe, il contient un `index.html`,
|
||
|
|
Apache le sert.
|
||
|
|
|
||
|
|
## Checklist quand ça arrive
|
||
|
|
|
||
|
|
1. `export const trailingSlash = 'always'` dans le `+layout.ts` racine.
|
||
|
|
2. `pnpm build` → vérifier que `build/quiz/index.html` existe
|
||
|
|
(et non `build/quiz.html`).
|
||
|
|
3. **Vider le dossier distant avant de re-uploader** : les anciens
|
||
|
|
`quiz.html` / `outils.html` et les vieux assets `_app/immutable/` hashés
|
||
|
|
doivent partir, sinon ils traînent indéfiniment.
|
||
|
|
4. Tester `curl -s https://<site>/<page>/` → du HTML, pas « Index of ».
|
||
|
|
|
||
|
|
Note : les liens internes relatifs (`./outils`) provoquent une petite
|
||
|
|
redirection 301 vers l'URL avec `/` final. Normal, invisible pour
|
||
|
|
l'utilisateur. L'éviter exigerait `paths.relative: false`, au prix de la
|
||
|
|
consultation locale des fichiers du build.
|