All entries

    React SEO Without a Rewrite: HTML, Canonicals and Real 404s

    How to make React routes readable on direct requests, preserve hydration, align canonicals and sitemaps, and return actual 404s without migrating frameworks.

    React page-rendering console with complete HTML pages, canonical links and a missing-page tile above futuristic London
    GPT-generated technical pixel-art illustration with a futuristic city backdrop. Conceptual engineering imagery, not a product screenshot or measured result.

    A route can look finished in a browser and still deliver the wrong document when requested directly. During the website work across this portfolio, UltraFit360 and Aptixlabs, that distinction became a recurring theme: the visible application, the returned HTML, the URL metadata and the HTTP status all need to describe the same page. This is not an argument that Google cannot render JavaScript. It is a practical account of reducing avoidable ambiguity without moving an existing product to another framework just for the sake of a rewrite.

    Inspect the document before the application starts

    Open a direct response for a subpage and inspect its title, canonical and readable body. If every route returns the homepage’s metadata and an empty root, the server has not delivered a page-specific document. A browser may later correct some of that after JavaScript runs, but not every reader or crawler executes that path.

    Server rendering and build-time prerendering address this in different ways. One renders when requested; the other emits a document during the build. Either can fit a mostly editorial site. The important question is whether the content, status and metadata are correct for that URL before relying on client-side navigation.

    Choose the smallest rendering change that fits

    A developer journal with stable articles often does not need a complete framework migration to deliver useful HTML. The current portfolio already has a server-rendering entry and static fallback generation. The other workspace records describe build-time page generation and capture strategies for similarly stable public content.

    That does not make prerendering universally sufficient. Frequently changing personalised content, authentication and server actions have different requirements. Keep private application routes separate from public editorial pages. Rendering a public article early should not accidentally include a signed-in user’s data in a static output directory.

    One route should have one consistent identity

    A canonical tag expresses the preferred URL for a document. Internal links, the sitemap and social metadata should normally point to that same final form. If the page says one address, the navigation points to a redirecting variant and the sitemap lists a third, the site has created unnecessary ambiguity.

    A self-referencing canonical also needs to match the actual page. Sending every recipe or article to the homepage canonical is not a harmless default. Conversely, a canonical does not replace a redirect when an old URL has genuinely moved. The purpose of each mechanism should be clear before adding more rules.

    EXPLAINED / SYSTEM FLOW

    One published route, one consistent URL identity

    A content record should drive the URLs that readers, crawlers and metadata encounter.

    Published content

    1. Route + article content

      Choose the final public address and rendering path.

    2. Readable HTML response

      Return the heading, body and actual links before client JavaScript runs.

    3. Consistent identity

      Use the final address in navigation, canonical metadata, social URLs and the sitemap.

    THE KEY DISTINCTION

    A canonical is a preference signal. It does not manufacture a page or replace correct redirects and response codes.

    Conceptual publication path for the article’s React rendering approach.

    Hydration needs the same content on both sides

    A page that contains useful prerendered HTML can still misbehave when React attaches if the client expects a different initial tree. Rotating text, current-time labels, random content and viewport-triggered animations are common sources of mismatch. A capture script should not merely freeze a flattering screenshot; it should preserve a document the application can reuse.

    The Aptixlabs implementation records include attention to text-node boundaries and predictable capture state. The general lesson is to verify both no-JavaScript delivery and hydrated behaviour. A static document passing a content check does not establish that navigation, menus and interactions remain healthy once the application runs.

    A missing article needs a missing-page response

    A catch-all rewrite can serve an app shell with status 200 for an unknown article. The frontend may then display “not found,” but the server still reported success. That mismatch can create soft-404 confusion and poor behaviour for direct consumers.

    A real 404 response can still use the site’s normal visual shell and useful navigation. It should not appear in the sitemap or be presented as a published article. Keep appropriate noindex handling on deliberate error pages; “remove every noindex tag” is too broad a rule. Indexability should follow the page’s actual purpose.

    EXPLAINED / SIDE BY SIDE

    A page request and an asset request need different handlers

    A catch-all app response must not turn missing pages or WebP URLs into successful HTML.

    Known published route

    1. Request article

      Return 200 with the article document and self-canonical.

    2. Old moved route

      Redirect to the final public route with a permanent redirect.

    3. Unknown article

      Return a genuine 404 and exclude it from the sitemap.

    Static image

    1. Request WebP path

      Serve actual image bytes and the matching content type.

    2. Route isolation

      Keep image URLs outside a forced article-rendering catch-all.

    3. Verify deployment

      Check the real response, not just whether the file exists locally.

    THE KEY DISTINCTION

    Test the deployed article, missing slug and image URL separately. A 200 status alone is not a health check.

    Response contracts, not measured crawl results or a guarantee of indexing.

    Keep the sitemap downstream of the content

    A manually maintained sitemap can drift when publication flags, routes and content live in separate places. A better fit for this journal is deriving sitemap entries from the same route/content registry used for rendering. Then a published entry has one source of identity and a draft can be excluded intentionally.

    Modification dates should represent real changes, not the current build time stamped onto every unchanged page. Adding more URLs is not itself an SEO improvement. Each listed address needs a useful, reachable page with a distinct intent. A thousand variations of the same thin answer are a content problem that rendering cannot repair.

    Test redirects and assets separately

    Redirect normalisation should avoid unnecessary hops, but a hosting provider may control part of the HTTP-to-HTTPS sequence. Document the actual behaviour rather than promise a one-hop result the application cannot enforce. At minimum, internal links should point directly to final canonical URLs.

    Static images need their own review. A broad forced redirect for article routes can accidentally intercept a nested image path and return HTML instead of WebP. Check both the status and content type of referenced assets, and keep their namespace separate where appropriate. A successful 200 response is insufficient if the bytes are an error document.

    A route-level acceptance check

    For every public page, inspect the direct status, visible H1, title, description, canonical, structured data and internal links. Repeat a representative sample with JavaScript enabled and disabled. Include unknown slugs, mobile navigation and image loading. This is a meaningful delivery check, not a ranking test.

    Then inspect the deployed output rather than assume a local build proves hosting behaviour. Search Console can later show Google’s indexed state and selected canonical, which a normal live fetch cannot establish. Keep those kinds of evidence separate. A clean technical audit makes discovery easier; it does not guarantee that Google will choose to index or rank the page.

    Scroll the table horizontally to see all columns.

    A route-level acceptance check
    Requested pageDirect responseCanonical / sitemap
    Published article200 with article HTMLSelf-canonical; listed
    Unknown article404 error documentNot listed
    Old moved article301 to final URLFinal URL preferred
    WebP assetActual image bytesNot an app-shell fallback

    Questions worth asking

    Does Google ignore all React sites? No. Google can render JavaScript, with limitations and processing stages. Directly useful HTML also serves readers and tools that do not run the application.

    Do I need a new sitemap after every article? The existing successfully submitted sitemap can be updated in place. Repeated submission is not a mechanism for forcing rank or index coverage.

    Does FAQ schema improve every article? It must match visible content and supported requirements. Structured data describes a page; it is not a substitute for useful writing or a promise of a rich result.

    FURTHER READING

    Sources

    Technical references checked .

    END OF ENTRY / 17
    BEHIND THE JOURNAL

    Eeshan Singh

    I’m Eeshan Singh Pokharia, an AI Full Stack Developer and CoFounder of UltraFit360. I work across AI features, full-stack product development, and web and mobile experiences—from Figma and frontend interactions to the systems behind them.

    I want the same care applied to page delivery as to frontend appearance. This article connects our website rendering and publishing records to a repeatable route-level review, with no promise that a technical pass guarantees indexing or search traffic.

    Meet the author