Skip to content

Producție: HTML real din server + limba în URL (SEO etapele 5-6)

Vitalie requested to merge prod-ssr-i18n into main

Pachetul de randare din server plus limba în URL, luat ca CONȚINUT de pe develop (cherry-pick, nu merge: istoriile au divergit). Verificat: după cherry-pick, git diff origin/develop e gol — ramura asta e, la nivel de fișiere, exact develop.

De ce

Măsurat pe producție înainte: /products/hypervolt-3 livra 2594 de octeți — titlul generic al site-ului, fără canonical, fără date structurate și zero cuvinte în corp. Google randează aplicația și vede pagina reală; Seobility, Bing și fiecare previzualizare de link de pe Facebook, WhatsApp sau Telegram citesc doar HTML, iar pentru ele magazinul nu avea conținut deloc.

Ce intră

HTML real din server. Backendul randează pagina inițială — deține deja datele, din aceleași interogări a construit sitemap-ul. Fiecare adresă pleacă cu titlul și descrierea ei, canonical, Open Graph și JSON-LD: Organization pe pagina principală, Product cu preț și disponibilitate, BreadcrumbList. Conținutul paginii și linkurile reale stau într-un bloc <noscript>, ca să nu clipească text nestilizat până pornește React.

Nu e randare completă pe server: React pornește și desenează pagina exact ca până acum.

Limba în URL. Româna pe rădăcină, rusa și engleza cu prefix. Routerul citește limba din adresă și pornește cu basename, deci toate linkurile paginii capătă prefixul fără ca vreun to= să fie modificat. hreflang reciproc pe cele trei, plus x-default spre română. Sitemap-ul listează fiecare pagină în toate trei: 384 de url-uri în loc de 128.

Adresele publicate până acum rămân valabile — devin versiunea românească.

Riscul principal, găsit și reparat înainte de acest MR

Pe dev, cu randarea activă, pagina de produs în rusă își desena antetul și subsolul și nimic între ele: antetele de securitate ale API-ului veneau cu pagina, iar default-src 'self' bloca toate apelurile către API — care stă pe alt domeniu în fiecare mediu (api-hyperice.vevdev.com, api.hyperice.md).

Ar fi doborât magazinul de producție. Plasa de siguranță nu putea prinde asta: randarea reușea, browserul refuza ce venea după. Pagina randată pleacă acum fără acel antet; API-ul îl păstrează. Două teste țin linia.

Nu HTML-ul a prins-o — arăta impecabil — ci verificarea vizuală în browser.

Verificat

  • 402 teste backend și 147 frontend, verzi pe această ramură; backendul rulat pe bază de test ștearsă, ca în CI.
  • nginx -t trecut; build-ul imaginii îl rulează la rândul lui.
  • Pe dev, după deploy: pagina de produs în rusă se încarcă complet, cu preț și buton de comandă; cele trei limbi au canonical propriu și 4 alternative; 301-urile păstrează limba; /ru/admin și /fr/about dau 404; sitemap 384 de url-uri; robots.txt neatins.
  • Control înainte de acest MR: CSP-ul scos, FRONTEND_ORIGIN implicit http://frontend (numele serviciului în AMBELE fișiere compose), frontendul așteaptă backendul sănătos, hosturile de producție rămân Allow în robots.

După merge

Pipeline-ul pornește singur și deploy:production nu e manual, deci merge-ul duce direct pe hyperice.md. Nimic de apăsat după: nu se schimbă date în bază.

De verificat imediat după deploy, în browser, nu doar în HTML: o pagină de produs se încarcă complet, robots.txt rămâne Allow: /, cele trei limbi răspund.

Datorie notată

Aplicația nu are o politică de securitate a conținutului proprie, nici înainte nici acum. Una scrisă pentru ea ar fi un câștig real, dar e lucrare separată.

Refs #2

Merge request reports