How to Prevent Broken Links During a Website Redesign

A website redesign is not just a visual project. It also requires careful decisions about what happens to the site’s URLs.

Suppose /services/web-design becomes /web-design during the redesign. That change may look minor, but the old URL could still be referenced by third-party websites, users’ bookmarks, search engines, old emails, and other sources outside your control.

The safest approach is to preserve existing URLs wherever possible and plan every necessary change deliberately. In this guide, we’ll do this by building an inventory of the site’s existing URLs, deciding what should happen to each one, implementing the changes, and verifying the results with Dr. Link Check.

1. Build a URL inventory

Before making any changes to your website, you need to understand exactly what you’re starting with. That means creating a reliable inventory of the URLs that exist today and how they currently behave.

A straightforward way to inventory a website is to crawl it from the outside, much like Googlebot or other search engine crawlers do. Instead of relying on what your CMS, database, or site structure says should exist, the crawler follows the website as it is actually published and builds a list of the URLs it encounters.

Dr. Link Check makes this straightforward. Although it is primarily designed to find broken and malicious links, every scan also produces an All links report containing all the URLs discovered during the crawl.

Set up a crawl

Go to your Dr. Link Check account at https://www.drlinkcheck.com/account and click the + button to create a new project:

1. Enter the website’s home page under “URL to check.”

If the site has an XML sitemap, add its URL on a separate line. You can often find the sitemap at a location such as https://www.example.com/sitemap.xml or referenced in the site’s robots.txt file at https://www.example.com/robots.txt.

Adding the XML sitemap helps fill gaps that a normal crawl would miss. For example, a page may still exist and be listed in the sitemap even though no other page on the site links to it. Such pages are commonly called orphan pages. By including the sitemap as an additional crawl source, Dr. Link Check can discover these URLs alongside the pages it finds by following regular <a href> links.

Screenshot: New Project

The sitemap may not contain every URL that still matters, though. An old page could have disappeared from both the site’s internal links and its current sitemap while still receiving search traffic, having backlinks, appearing in old emails, or being saved in users’ bookmarks.

If you already know about such URLs, add them to URLs to check as well, one per line. Useful sources can include Google Search Console, analytics, backlink data, older sitemaps, CMS exports, and records from previous campaigns.

The goal is not simply to crawl everything the current site links to. It is to build an inventory of the URLs that may still need to work, redirect, or otherwise be handled deliberately after the redesign.

2. Choose how much of the domain to crawl.

Under URLs to crawl, select Same root domain if the redesign covers the complete root domain, including its subdomains.

If only one particular domain is being migrated, select Same domain instead. For example, if www.example.com is being redesigned but jobs.example.com and blog.example.com are not, Same domain prevents those other subdomains from being treated as part of the website being crawled.

3. Optionally exclude links that aren’t useful for the migration inventory.

Dr. Link Check normally checks and reports all types of links, which is exactly what you want for a comprehensive broken-link check. For this particular job, however, checking every image, stylesheet, script, and outgoing link may consume a lot of your subscription’s link allowance without making the URL migration inventory more useful.

Under Advanced Settings → Ignore links if…, you can use an ignore rule to remove those links from the check. For a site on example.com, for instance, you can use:

(Host != "example.com" AND NOT Host ENDSWITH ".example.com") OR LinkType = ImgSrc OR LinkType = LinkStylesheet OR LinkType = ScriptSrc OR LinkType = CssImport OR LinkType = CssUrl OR LinkType = Other

Replace example.com with the site’s actual root domain.

This rule removes links outside the root domain along with common image, stylesheet, script, and miscellaneous resource links.

Notice that we’re not simply saying “keep only <a href> links.” Other potentially useful links remain in the report, including URLs found in social media meta tags, meta refresh tags, and XML sitemaps.

This filtering step is optional. If the site is small enough that the additional links aren’t a concern, keeping the broader crawl can be useful. And if files such as images or other resources have URLs that must survive the redesign, make sure your settings don’t exclude the links you actually need to migrate.

Screenshot: Advanced project settings

4. Run the check and inspect the “All links” report.

Before exporting anything, look through the results. The goal isn’t to audit every link yet. You’re checking whether the crawl looks like a useful representation of the site you’re about to migrate.

Are the main sections of the website present? Are URLs from the sitemap appearing? Are large numbers of irrelevant resources still cluttering the report? Is a subdomain showing up that isn’t part of the redesign?

If something looks wrong, adjust the project settings and rerun the check before continuing.

Review existing redirects

A redesign doesn’t start with a clean slate. The old site may already contain URLs that redirect elsewhere. Those redirects are worth reviewing before you create the new migration plan. Otherwise, you risk carrying years of accumulated redirect decisions and unnecessary redirect chains into the redesigned site.

In the All links report, click Add in the Filter bar and choose Redirect type.

Screenshot: Filter drop-down

By default, this shows temporary HTTP redirects using status codes 302, 303, or 307. Review these links and check whether the redirect is still intentional.

Then open the drop-down menu next to Redirect type and go through the other available values: Permanent (HTTP), HTTP refresh, Meta refresh, JavaScript, and Frame. For each redirect, inspect both the destination and how the old URL is being used.

When you hover over the Redirect tag next to a link in the report, a tooltip shows how many times the link was redirected. Click Details to see all locations in the redirect chain.

Screenshot: Redirect chain

Pay particular attention to long redirect chains. For example:

/seo → /seo-services → /services/seo

Every additional hop adds another dependency that can eventually break. If /services/seo is the intended final destination, there is usually no benefit in preserving the intermediate redirect through /seo-services.

If you find URLs in the redirect chain that are still referenced in bookmarks, old emails, search results, or backlinks, keep redirects for those URLs, but point them directly to the final destination:

/seo → /services/seo
/seo-services → /services/seo

This removes unnecessary hops without breaking old references.

In short: update links you control to point directly to the final URL, while keeping redirects for old references you don’t control.

Export the inventory

Once you’re satisfied with the crawl, go back to the All links report. Then click Export and select Export to CSV from the drop-down menu.

Screenshot: Export drop-down

This will generate a CSV file you can open in Microsoft Excel or other spreadsheet software for further processing. The export contains the URL itself along with information such as the final redirect destination and redirect type, link type, direction, media type, nofollow and noindex information, robots.txt status, and the first source URL where the link was found.

Screenshot: CSV export in Excel

Don’t worry about turning all of that into a migration plan yet. Keep this export as your raw crawl inventory. In the next step, we’ll add the information needed to decide whether each relevant old URL should stay where it is, move somewhere else, be consolidated with another page, or disappear intentionally.

2. Plan the URL migration

Now that you have an inventory of the existing site, the next step is to decide what should happen to those URLs after the redesign. There is one important rule to start with:

Don’t change a URL just because you’re redesigning the website.

A new design, CMS, navigation structure, or page template doesn’t automatically require a new URL structure. If an existing URL still accurately represents the resource and can continue to work on the new site, keeping it is usually the simplest and safest option.

This isn’t a new idea. In his 1998 W3C note Cool URIs don’t change, Tim Berners-Lee argued that website reorganization is not, by itself, a good reason to change published addresses. Once a URL has been published, you cannot know everywhere it has been referenced: other websites may link to it, users may have bookmarked it, and references may exist completely outside your control. He also argued that public URLs should be kept independent of changeable implementation details such as file locations or server-side technology. More than 25 years later, that principle is just as useful during a website redesign:

Keep the URL if you can. Redirect it if you must.

Create a migration matrix

The Dr. Link Check export already gives you useful information about the existing URL, including whether it currently redirects and where the redirect leads.

For the migration plan, add a few columns of your own. A practical starting point is:

Old URL Planned action New URL Expected result Reason
/website-design Keep /website-design 200 URL can remain unchanged
/seo-services Move /services/seo Permanent redirect → 200 URL structure is changing
/blog/old-seo-guide Consolidate /guides/seo Permanent redirect → 200 Content merged into new guide
/summer-offer-2025 Remove 404 or 410 Expired offer, no replacement

For a large migration, you may also want columns such as Priority, Owner, or Notes.

Later, when we test the redesigned site, we’ll add columns for the actual result and whether the URL passed or failed. For now, concentrate on defining the expected behavior.

The important part is that every relevant URL gets an intentional outcome.

Option 1: Keep the URL unchanged

This should be the first option you consider. Suppose the old website has:

https://www.example.com/website-design

The page is being redesigned, perhaps moved into a different CMS and given completely new HTML, but it still represents the company’s website design service. If there is no compelling reason to change the address, keep it. The user doesn’t need to know that the CMS, templates, database structure, navigation, or technology behind the page has changed.

Preserving the URL has several advantages:

  • existing links continue to work without a redirect;
  • bookmarks continue to work;
  • external websites don’t need to update their links;
  • there is no possibility of creating a redirect chain for that URL;
  • internal links can continue to point directly to the resource;
  • there is less migration logic to implement and test.

In other words, the safest redirect is the one you don’t need.

Don’t take this principle too far, though. Keeping an old URL doesn’t mean you should reuse it for something completely unrelated. The address should still represent substantially the same resource.

Option 2: Move the URL

Sometimes a URL genuinely has to change. For example:

https://www.example.com/seo-services

might become:

https://www.example.com/services/seo

If the new URL represents the same resource, record the change explicitly in the migration matrix:

Old URL:         /seo-services
Planned action:  Move
New URL:         /services/seo
Expected result: Permanent redirect → 200

The old URL should eventually lead directly to the new one using a permanent HTTP redirect, typically a 301 or 308. But before accepting the change, ask one additional question:

Why does this URL need to change?

If the answer is merely “the new structure looks cleaner,” reconsider whether the benefit is worth introducing a migration.

One useful discipline is to require a reason in the migration matrix for every URL that changes. This turns URL changes from an automatic consequence of a redesign into deliberate decisions.

Option 3: Consolidate URLs

A website redesign often involves cleaning up old content. Suppose the old site contains the following overlapping articles:

/blog/seo-basics
/blog/seo-tips
/blog/old-seo-guide

and the new site combines the useful material into:

/guides/seo

Those old pages aren’t simply “moving.” Several resources are being consolidated into one. Record that distinction in the migration matrix:

Old URL Planned action New URL
/blog/seo-basics Consolidate /guides/seo
/blog/seo-tips Consolidate /guides/seo
/blog/old-seo-guide Consolidate /guides/seo

The important question is whether the new destination is a genuine replacement for what users expected at the old URL. Don’t redirect a deleted page to the homepage simply to avoid returning a 404.

Option 4: Remove the URL

Some old resources should simply disappear. Imagine:

https://www.example.com/summer-offer-2025

The promotion has ended, there is no equivalent current offer, and there is no useful page that satisfies the same purpose. In that case, the correct migration decision may be:

Planned action:  Remove
New URL:         —
Expected result: 404 or 410

A 404 isn’t automatically a migration failure. An unexpected 404 is a problem. An intentional 404 or 410 for a resource that has been removed without a suitable replacement can be exactly the result you planned.

That distinction will become important when we build the migration tests later. The goal isn’t to make every historical URL return 200 OK somehow. The goal is for every URL to behave as intended.

Mark uncertain cases as “Investigate”

You don’t have to make every decision on the first pass. If you’re unsure whether a page should survive, whether another page is a suitable replacement, or why an existing redirect exists, mark it as Investigate. For example:

Old URL Planned action Reason
/partners/old-product Investigate Need to confirm whether product still exists
/help/setup-v1 Investigate Check whether new documentation covers same topic

This is better than guessing. But treat Investigate as a temporary status. Before launch, every URL that matters should eventually have a defined outcome.

Pay attention to existing redirects

The redirect review from the previous section becomes useful here. Suppose Dr. Link Check showed that:

/seo

already redirects to:

/seo-services

and the redesign will move /seo-services to:

/services/seo

If you simply preserve the existing redirect and add another one, you could end up with:

/seo → /seo-services → /services/seo

Your migration matrix should make the intended final destination clear:

Old URL Current redirect Planned final destination
/seo /seo-services /services/seo
/seo-services /services/seo

Design new URLs to last

Some URL changes will be unavoidable. When you create a new URL, don’t design it only for the website you have today.

Berners-Lee warned about putting information into URLs that is likely to change: implementation details, software mechanisms, organizational structures, document status, and similar temporary characteristics. His broader point is that the more a public address depends on today’s internal implementation or classification, the more likely you’ll need to change it later.

For example, think carefully before creating URLs that expose details such as:

/cgi-bin/
/wordpress/
/new-site/
/v2/
/old/
/draft/

The exact choices depend on the site, and even apparently descriptive categories can change over time. The useful question is:

Could we reasonably keep this URL if we redesigned the site again five years from now?

A migration is an opportunity not only to repair URLs that have become problematic, but to avoid creating the same problem for the next team.

3. Implement the migration

Your migration matrix now defines what should happen to each old URL. The next step is to put those decisions into practice.

For URLs marked Keep, make sure the redesigned site continues serving the page at exactly the same address. For URLs marked Move or Consolidate, create a permanent redirect to the destination recorded in the matrix. URLs marked Remove should return the intended response rather than being redirected somewhere unrelated.

How you implement this depends on the platform running the site.

WordPress: use a redirect plugin

On WordPress, redirects can be managed with a plugin such as Redirection. For a small migration, you can enter the old and new paths individually:

Source URL: /seo-services
Target URL: /services/seo

For a larger migration, entering hundreds of mappings manually is unnecessarily error-prone. Redirection can import redirects from CSV, which fits neatly with the migration spreadsheet from the previous section. The basic format is simply:

source URL,target URL

For example:

/seo-services,/services/seo
/old-seo-guide,/guides/seo

Screenshot: Redirection import

Redirection also supports regular expressions (regex). This is particularly useful when many URLs follow the same old and new pattern.

Suppose an entire section is moving from:

/products/widget-a
/products/widget-b
/products/widget-c

to:

/shop/widget-a
/shop/widget-b
/shop/widget-c

Instead of creating a separate redirect for every product, you could enable Redirection’s Regex option and use:

Source URL: ^/products/(.*)
Target URL: /shop/$1

Here, (.*) captures everything following /products/, and $1 inserts that captured part into the new URL. So:

/products/widget-a → /shop/widget-a
/products/widget-b → /shop/widget-b

A single redirect can therefore replace hundreds or thousands of individual mappings when the URL transformation is genuinely systematic.

Regex can also handle transformations such as removing an old file extension. For example:

Source URL: ^/guides/(.*?)\.html$
Target URL: /guides/$1/

would turn:

/guides/seo.html → /guides/seo/

The power of regex is also what makes it risky. Before replacing a large group of explicit mappings with one pattern, compare the rule against your migration matrix and look for exceptions. If most URLs under /products/ move to /shop/, but /products/documentation and /products/compare have different destinations, a blanket pattern would redirect them incorrectly.

Make your patterns as specific as necessary. Anchors such as ^ and $ can help restrict where a match begins and ends, and can also prevent rules from unexpectedly matching their own destination and creating redirect loops.

Also check how query parameters, trailing slashes, and letter case should be handled. Redirection provides options for these, while regex rules require you to account for some of these details yourself.

For a migration, the safest approach is usually a combination: use explicit redirects for exceptional URLs and regex rules for transformations that are truly consistent.

Apache: add redirects in .htaccess

If the website runs on Apache and .htaccess is available, simple redirects can be implemented with Apache’s Redirect directive:

Redirect 301 "/seo-services" "/services/seo"

Apache’s documentation recommends mod_alias, which provides Redirect, for simple URL redirections; more complicated transformations can use mod_rewrite.

There is one detail worth knowing before adding hundreds of rules: Redirect performs prefix matching. This rule:

Redirect 301 "/products" "/shop"

doesn’t apply only to /products. A request for:

/products/widget-a

will also match, with the remainder of the path appended to the new destination. That can be exactly what you want when an entire section moves. It can also produce unintended redirects if some URLs under /products have different destinations.

If you want an exact match, a regular-expression rule makes that explicit:

RedirectMatch 301 "^/seo-services$" "/services/seo"

Also pay attention to rule order. When multiple Redirect or RedirectMatch directives in the same context could apply, Apache processes them in order and the first match takes precedence. More specific rules should therefore normally appear before broader ones.

Nginx: return the redirect directly

With Nginx, an individual exact redirect can be expressed with an exact-match location:

location = /seo-services {
    return 301 /services/seo;
}

The return directive can send a 301 redirect, while the = modifier makes the location match that particular URI exactly.

For redirects based on patterns, Nginx also provides rewrite functionality.

Be cautious with bulk rules

For large migrations, pattern-based redirects and bulk replacements can save a lot of work. But a rule that is correct for most URLs can still send important exceptions to the wrong place.

Suppose most product URLs move like this:

/products/widget-a → /shop/widget-a

Before applying the same rule to everything under /products/, test variations such as:

/products/widget-a?ref=newsletter
/products/widget-a/
/Products/widget-a
/products/documentation

These raise different questions: Should query parameters be preserved? Should URLs with and without a trailing slash behave the same way? Is matching case-sensitive? And is /products/documentation really supposed to become /shop/documentation?

Also watch for overlapping rules. For example:

/products/documentation → /docs/
/products/*             → /shop/*

Both could match /products/documentation, so make sure the more specific exception is handled correctly.

4. Test the migration

Once the redesigned site is ready, it’s time to verify that the migration actually behaves as planned. There are two different tests to run:

  1. Crawl the redesigned site to find problems in the links it currently contains.
  2. Check the old URLs from your migration matrix individually to make sure each one produces the expected result.

You need both. A crawl of the new site cannot tell you what happened to an old URL that is no longer linked anywhere.

Crawl the redesigned site

In Section 1, you crawled the existing website to establish a baseline. Now repeat that process for the redesigned site, ideally while it is still on staging. Use the same crawl scope, but remove or adjust any inventory-specific ignore rule so the new crawl includes the resources and outbound links you want to test.

Review the results for any problems introduced during the redesign, including broken internal links, missing images or downloads, redirect loops or chains, and links that still point to redirected URLs.

After making corrections, rerun the check until the remaining issues are understood and intentional.

Test every old URL against the migration matrix

The site crawl only checks URLs that Dr. Link Check discovers while crawling the redesigned site. Your migration matrix contains another important group: old URLs that may no longer be linked anywhere. Those URLs still need to be tested.

Copy the Old URL column from your migration spreadsheet, then create a separate Dr. Link Check project:

  1. Click the + button.
  2. Paste the old URLs into URLs to check, one URL per line. You can enter up to 10,000 URLs at once.
  3. Under URLs to crawl, select None.
  4. Click Create Project to start the check.

Selecting None for URLs to crawl is important. It tells Dr. Link Check to check only the URLs you supplied rather than following links and crawling the sites they lead to.

Screenshot: URLs to check

Once the check finishes, compare the actual results with the expected behavior in your migration matrix. For example:

Old URL Expected result Actual result Test
/website-design 200, no redirect 200 Pass
/seo-services Permanent redirect to /services/seo Permanent redirect to /services/seo Pass
/old-seo-guide Permanent redirect to /guides/seo Redirects to /blog, then /guides/seo Fail
/summer-offer-2025 404 or 410 404 Pass

Add columns such as Actual result, Actual destination, and Pass/Fail to the migration matrix if you haven’t already.

The important point is that a migration test asks a different question from an ordinary broken-link check. A 404 isn’t necessarily a failure. If /summer-offer-2025 was deliberately removed and your migration plan specifies a 404 or 410, that result is correct. Likewise, a URL isn’t necessarily a success just because it eventually loads a working page. If you expected:

/seo-services → /services/seo

but actually get:

/seo-services → /services → /services/seo

the final page works, but the migration test should still fail because an unnecessary redirect was introduced. The standard is not simply “Does this URL work?” It is: “Does this URL behave exactly as we planned?”

Repeat the checks after launch

Even if everything passes on staging, repeat the tests after the redesigned site goes live. Production may use different web server rules, CDN configuration, caching, domain settings, or other infrastructure that wasn’t present on staging. At minimum:

  • crawl the live website again with Dr. Link Check;
  • review broken and redirected links;
  • rerun the old-URL test against the migration matrix;
  • investigate any result that differs from what you tested on staging.

It is also worth checking again after the site has been live for a while. Analytics, Search Console, server logs, support requests, or other sources may reveal old URLs that weren’t in your original inventory. Add those URLs to the migration matrix, decide what should happen to them, and test them in the same way.

At that point, the migration matrix is no longer just a planning document. It has become a repeatable test suite for proving that the old and new URL structures connect exactly as intended.

Conclusion

Preventing broken links during a website redesign is less about fixing 404s after launch and more about controlling what happens to every important old URL.

Start with a reliable inventory, keep URLs unchanged wherever possible, define an explicit outcome for URLs that do change, implement redirects carefully, and then test the results against your migration matrix.

Dr. Link Check can support that process at several stages: inventorying the old site, reviewing existing redirects, checking the redesigned site for broken or redirected links, and mass testing old URLs after the migration.

The key is to treat the redesign as a testable URL migration, not just a visual or technical rebuild. If you know what each old URL is supposed to do and verify that it actually does it, you greatly reduce the risk of broken links, unnecessary redirect chains, and forgotten URLs slipping through the redesign.


Älterer Post