404 real: ecranul magazinului pentru vizitator, status corect pentru crawler
Două defecte se întâlneau pe aceeași cale.
Ecranul greșit. O adresă necunoscută ajungea pe pagina implicită nginx: un
ecran alb de 153 de octeți, în engleză, cu versiunea serverului scrisă pe el și
fără niciun drum înapoi spre magazin. Cauza e o subtilitate de nginx —
error_page se moștenește prin înlocuire, nu prin adăugare, iar
error_page 500 502 503 504 din location @spa anula complet regula de 404 de
la nivel de server. Comentariul din configurație promitea deja comportamentul
corect; doar directiva lipsea din blocul potrivit.
Statusul greșit. Un produs, o colecție sau un articol care nu există
răspundea 200 cu textul „Pagina nu a fost găsită". Google numește asta soft 404
și ține adresa inventată în index. Randorul știa deja că pagina lipsește; acum
o și spune, iar ruta transformă verdictul în status. Steagul notFound e
deliberat separat de noindex, pe care îl poartă și formularul de comandă și
pagina de cont, care sunt pagini reale cu 200.
În plus, server_tokens off — versiunea nginx nu mai apare nici în antetul
Server, nici pe paginile de eroare.
Verificare de comportament, nu doar de sintaxă. Am rulat ambele configurații în nginx 1.27 într-un container, cu același shell pe disc:
| configurația veche | configurația nouă | |
|---|---|---|
/pagina-inexistenta |
404, 153 octeți, pagina nginx | 404, shell-ul aplicației |
antetul Server
|
nginx/1.27.5 |
nginx |
| rută cunoscută, backend căzut | 200, shell | 200, shell (neschimbat) |
| fișier real pe disc | 200 | 200 |
Plasa de siguranță pentru randor căzut rămâne cu =, deci un 502 continuă să
dea 200 cu shell-ul — un randor stricat nu are voie să ia magazinul cu el.
Verificare: backend 411 teste în 25 de fișiere, frontend 152 în 19; ambele
build-uri curate; tsc --noEmit -p tsconfig.app.json curat; nginx -t trece.
Closes #4 (closed)