Skip to content

Feat: okos 404 (javaslatok és slug-előzmény) #78

Description

@Xentinus

Jelenség

A 404 oldal statikus: egy DetailNav és egy StatusPanel, semmi útmutatás.

<template>
  <div class="page">
    <DetailNav :show-lang="true" />
    <StatusPanel />
  </div>
</template>

Aki elírja a slugot, vagy egy régi, átnevezett linkre érkezik (a slug módosítható az adminban, tehát ez rendszeresen elő fog fordulni), az egy zsákutcát kap. Pedig a szerver pontosan tudja, milyen slugok léteznek: a PublicRouteIndex teljes slug-listája ott van a memóriában/Redisben, ez alapján dől el a 404-es státusz is.

Mellékesen a NotFoundView kommentje elavult — azt írja, hogy a szerver 200-at ad kiterjesztés nélküli útvonalra, holott a MapSpaFallback óta valódi 404 megy ki:

// noindex because the server still answers 200 for extension-less paths: an SPA cannot
// set a status code, so the robots tag is what keeps a mistyped URL out of the index.

Javaslat

  1. Javaslatok a 404 oldalon: a legközelebbi létező slugok ugyanabban a szekcióban (Levenshtein-távolság vagy közös prefix), plusz a legutóbbi néhány munka linkje mint kilépési pont.
    2A. Kliensoldali változat: a content store amúgy is betölti az összes tartalmat, tehát a javaslat a meglévő listákból kiszámolható, backend nélkül. Ez az egyszerűbb út.
    2B. Szerveroldali változat: a SpaShell a 404-es ágon beír egy javaslat-listát a HTML-be a PublicRouteIndex-ből — akkor is látszik, ha a JS nem fut, de több munka. A Perf: edge-cache-elt HTML (s-maxage + Cloudflare purge) #58 (edge-cache) miatt figyelni kell rá, hogy a 404-es ág no-store marad.
  2. Ha a slug-átnevezés gyakori, érdemesebb a gyökérnél megfogni: slug-előzmény tábla (SlugAlias: régi slug, entitás, új slug), és a MapSpaFallback 301-et ad a régi slugról az újra. Ez SEO-szempontból többet ér, mint bármilyen 404-es javaslat, mert a link értéke megmarad. Érdemes ugyanebben az issue-ban dönteni a kettő között.
  3. A NotFoundView elavult kommentjének javítása, és a robots tag megtartása (a szkriptet futtató crawler második vonala).

Érintett fájlok

  • portfoliocms.client/src/views/NotFoundView.vue, src/components/common/StatusPanel.vue
  • portfoliocms.shared/stores/content.ts (ha kliensoldali javaslat)
  • PortfolioCMS.Core/Extensions/SpaFallbackExtensions.cs, PortfolioCMS.Core/Services/PublicRouteIndex.cs (ha szerveroldali vagy slug-alias)
  • új PortfolioCMS.Core/Models/SlugAlias.cs + migráció (ha a 3. pont)
  • PortfolioCMS.Tests/SpaFallbackTests.cs

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions