Independent technical referenceSystem / content / protocol / route

Operations / migration

Migrating a blog without breaking its URLs

Entry abstractA migration is complete when the publication's meaning and public identity survive, not when the new homepage renders.

Blog migrations fail at the edges: an image folder is missed, local dates shift, comments detach, feed identifiers change or an old route falls through to a generic homepage. The safe approach is an inventory, an explicit transformation and repeatable validation before traffic moves.

Inventory before exporting

Count posts, pages, drafts, comments, categories, tags, authors and media. Record the oldest and newest dates, all feed URLs and the canonical host. Crawl internal links and extract every distinct public path. Server logs and backlink evidence can reveal important addresses that are absent from current navigation.

Take an application-aware backup before any transformation. Then produce the most structured export the old engine supports. BlogML was one historical attempt at a cross-engine representation; other systems use XML, JSON or database-specific exports. The format name matters less than whether it retains IDs, dates, authorship, status, relationships and raw body markup.

Define the content mapping

Old fieldNew fieldDecision to record
Entry IDImmutable source IDKeep for reconciliation
Published datePublished timestampPreserve offset and precision
PermalinkCanonical routeKeep or redirect exactly
CategoryCategory or tagDefine hierarchy behavior
Body HTMLRendered content sourceSanitize without rewriting meaning

Do not collapse distinct states accidentally. A draft is not a published post with a hidden link. An updated time is not a publication time. A category path may be both navigation and a subscribed feed. Write mapping rules before importing so that reruns produce the same result.

Move media as a referenced graph

Extract image, audio and document references from entry bodies as well as dedicated media tables. Normalize relative URLs against the original entry location. Preserve filenames where public links exist, or create exact redirects to the new object. Check MIME type, byte size and dimensions after copying.

Build a URL ledger

For every old route, choose one outcome: retained page, direct permanent redirect, or deliberate not found. Avoid catch-all rules. A route with a true replacement should map to it; a spam or unrelated path should not be laundered into the new site. Include case, extensions, trailing slashes, encoded characters and known query-based routes in the test set.

Feeds need a separate comparison

Compare old and new feed entries by stable identity, not only title. Publication dates, update dates, canonical links and summaries should survive. Redirect an old feed directly if its address changes. Validate the content type and XML, then make conditional requests to confirm caching behavior.

Rehearse and reconcile

Cut over with a rollback point

Freeze or reconcile late edits, take a final consistent backup, run the proven import and switch routing. Keep the old system inaccessible to the public but available for comparison until validation finishes. Monitor not-found requests and feed errors closely; they are often the fastest evidence of an incomplete URL ledger.

Save the reconciliation results with the migration plan. They become the baseline for later audits and make unexpected count changes visible.

Preserve meaning, then modernize

A migration window is the wrong time to rewrite every title, path and template. First reproduce the publication faithfully and preserve identity. Once the new system is stable, design and content can evolve in separate, reviewable changes. The URL guide and storage comparison provide the two key inputs.