Skip to content

Bottoni che portano dove dicono, e una sessione che non si perde in silenzio - #19

Merged
dade1987 merged 1 commit into
mainfrom
claude/broken-links-session-loss-cggyyt
Aug 13, 2026
Merged

dade1987 merged 1 commit into
mainfrom
claude/broken-links-session-loss-cggyyt

Conversation

@dade1987

Copy link
Copy Markdown
Owner

Tre guasti, tutti invisibili: nessun errore in console, nessuna richiesta
fallita, solo un bottone che porta altrove e dei progressi che smettono di
salvarsi.

  1. href('metodo') invece di href('method'). La chiave non esisteva, href()
    ricadeva sulla home senza dire niente, e il bottone «Come è fatto questo
    corso» — in fondo a OGNI lezione, in tutte e tre le lingue — portava alla
    mappa. Risponde 200: nessun controllo sugli stati HTTP lo avrebbe visto.
    Adesso una pagina inesistente è un errore, non un ripiego.

  2. l.file usato nudo come href nella mappa. È un indirizzo relativo, e la home
    inglese si raggiunge sia come /en/ sia come /en — l'.htaccess toglieva la
    barra finale con un 301, quindi la seconda era la forma in cui ci si
    ritrovava davvero. Da lì «lessons/01-qubit.html» diventava
    /lessons/01-qubit.html: 404 su tutte le carte della mappa e sul bottone
    «Continua», in inglese e in spagnolo. Ora l'indirizzo lo compone
    lessonHref(), che parte dalla radice, ed è uno solo per tutto il sito.
    L'.htaccess smette anche di rimandare altrove /en/ e /es/, che sono gli
    indirizzi scritti nel canonical, negli hreflang e nella sitemap.

  3. Il token CSRF si chiedeva a /sanctum/csrf-cookie, rotta di un pacchetto che
    qui non è installato: 404, ignorato di proposito. Finché la pagina era
    appena stata caricata funzionava lo stesso, perché il cookie lo mette anche
    la pagina; ma il token scade con la sessione, cioè dopo due ore, e chi gioca
    sta sulla stessa pagina anche più a lungo. Da lì ogni salvataggio tornava
    419 — e un token scaduto non viene rinnovato dalla risposta che lo rifiuta,
    quindi non se ne usciva più: la partita continuava e niente si salvava.
    L'esame finale, che è un POST solo, si perdeva per intero. Adesso c'è
    GET /api/csrf, e davanti a un 419 il client riprende il token e rimanda la
    richiesta, una volta sola.

Il quarto guasto — i tag «» scritti in chiaro nel riquadro «Livello
superato» — era già corretto nel codice ma non era protetto da niente:
succedeva perché la frase era passata a h() come figlio, che crea un nodo di
TESTO, invece che come { html: … }. Ora un controllo lo vede.

Collaudo, perché ognuno di questi passava indenne dai test che c'erano:

  • tests/js/unit/indirizzi.test.js: gli indirizzi prodotti, lingua per lingua
  • tests/js/unit/api.test.js: il giro del token CSRF e il 419
  • tests/Feature/SessioneTest.php: la rotta del token e il cookie «ricordami»
  • tests/js/e2e/05-link.spec.js, 06-link-dentro.spec.js: dove portano davvero i
    bottoni, comprese le home senza barra finale e il riquadro a livello finito
  • tools/validate.mjs: markup passato come figlio di h(), nomi di pagina
    inesistenti, indirizzi di livello relativi, eccezione dell'.htaccess

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_0123HAw4ybUrziyBM91pzLna

…ilenzio

Tre guasti, tutti invisibili: nessun errore in console, nessuna richiesta
fallita, solo un bottone che porta altrove e dei progressi che smettono di
salvarsi.

1. href('metodo') invece di href('method'). La chiave non esisteva, href()
   ricadeva sulla home senza dire niente, e il bottone «Come è fatto questo
   corso» — in fondo a OGNI lezione, in tutte e tre le lingue — portava alla
   mappa. Risponde 200: nessun controllo sugli stati HTTP lo avrebbe visto.
   Adesso una pagina inesistente è un errore, non un ripiego.

2. l.file usato nudo come href nella mappa. È un indirizzo relativo, e la home
   inglese si raggiunge sia come /en/ sia come /en — l'.htaccess toglieva la
   barra finale con un 301, quindi la seconda era la forma in cui ci si
   ritrovava davvero. Da lì «lessons/01-qubit.html» diventava
   /lessons/01-qubit.html: 404 su tutte le carte della mappa e sul bottone
   «Continua», in inglese e in spagnolo. Ora l'indirizzo lo compone
   lessonHref(), che parte dalla radice, ed è uno solo per tutto il sito.
   L'.htaccess smette anche di rimandare altrove /en/ e /es/, che sono gli
   indirizzi scritti nel canonical, negli hreflang e nella sitemap.

3. Il token CSRF si chiedeva a /sanctum/csrf-cookie, rotta di un pacchetto che
   qui non è installato: 404, ignorato di proposito. Finché la pagina era
   appena stata caricata funzionava lo stesso, perché il cookie lo mette anche
   la pagina; ma il token scade con la sessione, cioè dopo due ore, e chi gioca
   sta sulla stessa pagina anche più a lungo. Da lì ogni salvataggio tornava
   419 — e un token scaduto non viene rinnovato dalla risposta che lo rifiuta,
   quindi non se ne usciva più: la partita continuava e niente si salvava.
   L'esame finale, che è un POST solo, si perdeva per intero. Adesso c'è
   GET /api/csrf, e davanti a un 419 il client riprende il token e rimanda la
   richiesta, una volta sola.

Il quarto guasto — i tag «<b>» scritti in chiaro nel riquadro «Livello
superato» — era già corretto nel codice ma non era protetto da niente:
succedeva perché la frase era passata a h() come figlio, che crea un nodo di
TESTO, invece che come { html: … }. Ora un controllo lo vede.

Collaudo, perché ognuno di questi passava indenne dai test che c'erano:
- tests/js/unit/indirizzi.test.js: gli indirizzi prodotti, lingua per lingua
- tests/js/unit/api.test.js: il giro del token CSRF e il 419
- tests/Feature/SessioneTest.php: la rotta del token e il cookie «ricordami»
- tests/js/e2e/05-link.spec.js, 06-link-dentro.spec.js: dove portano davvero i
  bottoni, comprese le home senza barra finale e il riquadro a livello finito
- tools/validate.mjs: markup passato come figlio di h(), nomi di pagina
  inesistenti, indirizzi di livello relativi, eccezione dell'.htaccess

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123HAw4ybUrziyBM91pzLna
@dade1987
dade1987 merged commit da53a5c into main Aug 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants