Natvrdo psaný odkaz v default-locale slugu 301-uje a přepne uživateli jazyk
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Web s lokalizovanými slugy (EN /sign-up, CS /cs/registrace, DE /de/registrieren). Uživatel je na anglické verzi, klikne na „Register / Sign in” — a stránka se přepne do češtiny. Zbytek navigace funguje; rozbité je jen pár odkazů (typicky auth: přihlášení/registrace), které „někdo zapomněl” při i18n migraci.
Root cause
Sekce “Root cause”Default locale (EN) jede bez prefixu, ostatní s prefixem (/cs/…). Slugy se mezi jazyky překládají (registrace↔sign-up). Middleware navíc 301-uje „holé” CS slugy (legacy bookmarky) na /cs/…:
/registrace → 301 → /cs/registrace (čeština!)/sign-up → 200 (kanonická EN URL)Rozbitý odkaz byl postavený dvěma způsoby, oba vedou na český slug bez prefixu:
<a href="/prihlaseni/"> // ❌ natvrdo CS slugwithLocale('/registrace', lang) // ❌ jen přidá prefix; pro default locale // vrátí holé '/registrace' → 301 na /csSprávné odkazy v navigaci přitom používaly překladač slugů, proto byl rozbitý jen ten dohledaný zbytek.
Fix
Sekce “Fix”Použij helper, který přeloží slug podle jazyka (a u default locale vrátí anglický slug bez prefixu):
localizedPath('prihlaseni', lang) // en → /sign-in, cs → /cs/prihlaseni, de → /de/anmeldenlocalizedPath('registrace', lang) // en → /sign-up, cs → /cs/registracePo opravě EN uživatel zůstane v EN (/sign-in → /sign-up, oba 200), CS i ostatní beze změny.
Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: grep natvrdo psané lokalizované slugy v odkazech:
grep -rnE "href=\"/(prihlaseni|registrace|kosik|…)" src/agrep -rn "withLocale('/"(prefix-only helper na přeložitelný slug je červená vlajka). Test: pro každý interní odkaz ověř, žecurl -Ina něj v default locale vrátí 200, ne 301. - Anti-pattern: dva helpery — jeden jen přidává prefix (
withLocale), druhý překládá slug (localizedPath) — a vývojář sáhne po tom nesprávném. Nebo natvrdohrefna slug v jazyce, ve kterém byl web původně psaný. - Lepší přístup: jediná funkce pro interní odkazy, která VŽDY přeloží slug i přidá prefix; prefix-only helper drž jen pro cesty bez přeložitelného slugu. CI smoke-test, že žádný odkaz v default locale nevrací 301.
Sister bugs / související
Sekce “Sister bugs / související”Stejná past u kanonických <link rel="canonical"> a sitemap — když je generuješ z holého slugu, ukážeš Googlu URL, která se 301-uje, a rozmělníš signál. Příbuzné: [[i18n-cookie-overrides-tenant-language]] (jazyk se bere ze špatného zdroje).