Indexare și antete de cache în nginx
Închide #26 (closed) și #37 (closed). Ambele ating frontend/nginx.conf, de aceea vin împreună, în două commit-uri separate.
Indexare (#26 (closed)). https://hyperice.md/index.html răspundea 200 și servea shell-ul brut — o a doua adresă pentru pagina de start, cu titlul din build, fără canonical, fără date structurate. Acum răspunde 301 către /, cu query string-ul păstrat. Redirectul e condiționat pe $request_uri, ca error_page 404 /index.html să ajungă tot acolo și un URL inexistent să rămână 404 cu ecranul magazinului, nu să sară pe prima pagină. /admin primește X-Robots-Tag: noindex, nofollow — „Disallow" înseamnă „nu intra", nu „nu afișa".
Grupul dublu User-agent: * din robots.txt nu e atins: e inserat de Cloudflare, e setare de zonă și e decizia lui Vitalie.
Cache (#37 (closed)). Patru categorii de fișiere ieșeau fără niciun antet și primeau patru ore implicit de la Cloudflare. Acum: /fonts/ un an cu immutable (nu se re-taie niciodată sub același nume), imaginile din public o zi (nu immutable — nu au amprentă în nume, deci o poză înlocuită ar rămâne blocată la vizitatorii vechi), robots.txt o oră.
Două capcane nginx tratate explicit: /uploads/ și /assets/ au primit ^~, altfel blocul regex nou pentru imagini le-ar fi furat — /uploads/*.jpg ar fi devenit 404 din disc în loc de proxy către backend. Iar try_files $uri /index.html =404 în /admin păstrează add_header, care s-ar fi pierdut la un redirect intern.
Ultimul punct din #37 (closed), Browser Cache TTL pe „Respect existing headers", e setare de zonă Cloudflare și rămâne nebifat.
Verificat pe nginx 1.27 real, în container, cu fișierele montate: /index.html → 301 /; /index.html?a=1 → 301 /?a=1; / → 200; /admin → 200 cu X-Robots-Tag; URL inexistent → 404 cu ecranul magazinului; fonturi și /assets/ → un an immutable; imagini → o zi; robots.txt → o oră; favicon → no-cache; /uploads/ și /api/ → tot proxy.