A broken internal link is a link on the client’s own site that points to a page returning a 4xx status, usually 404 Not Found. This guide covers the crawl issue Broken internal links (4xx) and the audit checks Broken links and resources and Failed requests.
Find the affected pages in the app
- Open Site crawl, open the crawl and go to the Issues tab.
- Click Broken internal links (4xx). It lists the affected URLs (the first 20). These are the dead destinations, not the pages that contain the links.
- To see where each dead URL is linked from, open the Links tab and click the Broken chip.
- Each row shows Found on (the page with the bad link), Link to (the dead URL), the Anchor text and the HTTP status. Use Search URL or anchor text to filter.
- For the full list, click Export.
- In an audit report (open it from Audits), open Issues to fix and look for Broken links and resources (Links section) or Failed requests (Technical & security). The value shows the failing URLs and their status codes.
Broken internal links (4xx)
How we detect it
The crawler follows every internal link it finds and records the HTTP status of each destination. Any internal link whose destination returned a status from 400 to 499 is counted. Only pages on the same site count (www and non-www are treated as the same site), plus subdomains if you switched on Include subdomains (see Run a site crawl). It is an error.
Why it matters
- Visitors who hit a 404 usually leave, so the client loses enquiries.
- Google spends crawl time on dead URLs instead of real pages.
- Links pass ranking value. A link to a 404 passes it nowhere, so the page you wanted to support gets weaker.
Common causes
- If the dead URL used to be a real page → it was deleted, renamed or moved (redesign, CMS migration, slug change).
- If the dead URL looks almost right (
/servcies/,/About-Us) → a typo or wrong letter case on a case-sensitive server. - If hundreds of pages link to the same dead URL → the bad link sits in the menu, footer, sidebar or a widget.
- If the dead URL contains
staging.,.localorhttp://→ links were copied from a staging site or the old HTTP version. - If it is a product or tag URL → the product sold out and was deleted, or the category/tag was removed.
- If many unrelated, live pages show 403 → the site’s firewall blocked the crawler; nothing is broken. Use Fix: 403 and 429 from the server.
Fix: basic
Decide what each dead URL should become:
- The page moved → update the links to the new URL and add a 301 redirect from the old URL to the new one.
- The page has a close replacement (similar service, newer product, updated article) → 301 redirect to it and update the links.
- The page is gone with no replacement → remove or change the links and let the URL return 404 or 410.
- The URL is a typo → correct the link. No redirect needed.
Then fix the links in this order:
- Fix links that appear on every page first (menu, footer, sidebar). One menu fix can clear hundreds of rows.
- Fix links inside page content, using the Found on column.
- Add 301 redirects for moved URLs (see Platform steps).
- Remove the dead URLs from the XML sitemap (how sitemaps work). WordPress with Yoast SEO or Rank Math does this automatically when the page is deleted or set to draft.
Fix: expert
Redirects on the server. Point each redirect straight to the final URL, never to a URL that redirects again (that creates a redirect chain, see Fix: HTTPS, SSL and redirects › Redirect chains).
Apache (.htaccess in the site root, above the WordPress block if there is one):
Redirect 301 /old-page/ https://example.com/new-page/
# A whole folder:
RedirectMatch 301 ^/blog/2019/(.*)$ https://example.com/blog/$1
# Gone for good (410):
Redirect gone /discontinued-product/
nginx (inside the server { } block):
location = /old-page/ { return 301 https://example.com/new-page/; }
# A whole folder:
rewrite ^/blog/2019/(.*)$ https://example.com/blog/$1 permanent;
# Gone for good (410):
location = /discontinued-product/ { return 410; }
Test and reload nginx:
sudo nginx -t && sudo systemctl reload nginx
Replace an old URL across a whole WordPress database with WP-CLI (take a backup first; the first line is a dry run):
wp search-replace 'https://example.com/old-page/' 'https://example.com/new-page/' --all-tables --dry-run
wp search-replace 'https://example.com/old-page/' 'https://example.com/new-page/' --all-tables
Platform steps
WordPress
Fix the links:
- Menu links: Appearance › Menus (classic themes) or Appearance › Editor › Navigation (block themes). Edit or remove the item, then Save Menu / Save.
- Footer and sidebar links: Appearance › Widgets, or Appearance › Editor › Patterns › Template Parts › Footer.
- Links in content: open the page in the editor, click the link, change the URL, then Update.
- Many pages at once without WP-CLI: install Better Search Replace, open Tools › Better Search Replace, enter the old and new URL, tick all tables and Run as dry run, check the count, then run it again with the dry run unticked.
Add a redirect (pick the plugin the site already uses):
- Rank Math: in WordPress admin, turn on the module in Rank Math SEO › Dashboard › Modules › Redirections (Rank Math KB).
- Then Rank Math SEO › Redirections › Add New › Source URL (old path) › Destination URL › type 301 Permanent Move › Add Redirection.
- Yoast SEO Premium (Yoast help): Yoast SEO › Redirects › Old URL, New URL, type 301 Moved Permanently › Add Redirect.
- Redirection plugin (free): Tools › Redirection › Add new redirection › Source URL
/old-page/, Target URL/new-page/› Add Redirect.
Shopify
- Menus: in Shopify admin › Online Store › Navigation, open the menu (Main menu, Footer menu), edit the item, Save menu.
- Links in pages and products: open the page or product, edit the link in the description, Save.
- Links inside theme sections: Online Store › Themes › Customize, select the section, fix the link field, Save.
- Redirects: Shopify admin › Online Store › Navigation › URL Redirects (newer admins: type “URL redirects” in the admin search) › Create URL redirect.
- Enter Redirect from
/products/old-itemand Redirect to/products/new-item, then Save redirect. Shopify redirects only fire when the old URL really returns 404.
Webflow
- In the Designer, select the link and change it in Link settings. Use the Navigator to find links inside components used site-wide.
- Redirects: Site settings › Publishing › 301 redirects › Old path
/old-page, Redirect to/new-page› Add redirect path. - Click Publish.
Wix
- In the Editor, click the menu or text link, Change link, then Publish. Site menus are under Site Menu › Manage Menu.
- Redirects: Wix dashboard › Marketing & SEO › SEO › Tools and settings › URL Redirect Manager › + New Redirect › Old URL and New URL › Save.
Squarespace
- Fix navigation links in the Pages panel and text links by editing the text block, then Save.
- Redirects: in your Squarespace account, open the site › Settings › Developer Tools › URL Mappings (older menus: Settings › Advanced › URL Mappings). Add one line per redirect and Save:
/old-page -> /new-page 301
Verify the fix
- Open one of the old URLs in a private browser window. A moved page should land on the new URL; a removed page should show 404 or 410.
- Check the status from a terminal. You want one
301then a200, or a404/410for removed pages.
curl -I https://example.com/old-page/
curl -IL https://example.com/old-page/
- In the app, open the crawl in Site crawl and click Crawl again.
- When it finishes, open Compare and check that Broken internal links (4xx) is under Fixed issues, not Persisting.
- Optional: in Google Search Console › Pages, open Not found (404) and click Validate fix.
Automation
Assisted: finding dead links and suggesting the closest live URL is automatic; updating links and adding redirects needs WordPress admin via plugin (Rank Math/Redirection), the Shopify Admin API (URL redirects) or server SSH for .htaccess/nginx.
Broken links and resources
How we detect it
The audit loads the page and records every link, image, script and stylesheet that answers with a 4xx or 5xx status. The check is Critical (Links section). The report lists up to five failing URLs with their status, for example /old-offer (404). When all load, it shows “All links and resources load.”
Why it matters
Broken links frustrate visitors and waste Google’s crawl time. A missing image, CSS or JavaScript file can break the layout, a slider or a contact form.
Common causes
- If the failing URL is a page → see the causes under Broken internal links (4xx) above.
- If it is a file returning 404 → the file was deleted or renamed, or a plugin/theme update changed its path.
- If it is a file returning 403 → hotlink protection, a firewall rule or wrong file permissions.
- If it returns 5xx → the server failed; see Fix: Server errors (5xx).
- If it is a third-party URL (fonts, widgets, tracking) → the provider removed or moved the file.
Fix: basic
- Copy the failing URL from the report value and open it in a new browser tab to confirm the status.
- Page links: fix them as in Broken internal links (4xx) above (update the link or add a 301).
- 404 file: upload the file again at the same path, or edit the page to use the new file.
- Third-party file: update the embed code from the provider, or remove the widget.
- Clear the cache plugin and the CDN cache, then reload the page.
Fix: expert
- File permissions should be 644 for files and 755 for folders:
find /var/www/example.com -type f -exec chmod 644 {} \;
find /var/www/example.com -type d -exec chmod 755 {} \;
- If hotlink protection blocks your own files, make sure the site’s own domains (with and without www) are on the allowed list.
- Search the theme for a hard-coded old path:
grep -rn "old-file-name.js" wp-content/themes/ wp-content/plugins/
Platform steps
WordPress
- Re-insert a missing image from Media › Library in the page editor, then Update.
- After a plugin or theme update, clear the cache: LiteSpeed Cache › Toolbox › Purge All, WP Rocket › Clear cache, or W3 Total Cache › Performance › Purge All Caches.
Shopify
- Re-upload the file under Content › Files, copy its new URL and update the section or description that uses it.
- Remove leftover app code from uninstalled apps: Online Store › Themes › … › Edit code, search
theme.liquidfor the app’s script tag and delete it.
Cloudflare
- Hotlink protection: in the Cloudflare dashboard, pick your site › Scrape Shield › Hotlink Protection. Turn it off, or make sure the files are served from the site’s own domain.
- Purge the cache: Cloudflare dashboard › your site › Caching › Configuration › Purge Everything.
cPanel
- Hotlink protection: log in to your host’s cPanel › Security › Hotlink Protection. Add every domain of the site to URLs to allow access, then Submit.
Verify the fix
- Open each formerly failing URL; it should return 200.
- Open the audit report from Audits and click Run again. Broken links and resources should show “All links and resources load.”
Automation
Assisted: detection is automatic; re-uploading files or editing theme code needs WordPress admin, Shopify Admin API (Files, themes) or server SSH.
Failed requests
How we detect it
The classic audit records the files the page tried to load that failed (the have_error_req statistic) and shows Failed requests under Technical & security.
Why it matters
Each failed file is a broken part of the page: a missing image, style, script or font. It also wastes a request and slows the page.
Common causes
- If the failed file is on the client’s domain → same causes as Broken links and resources (deleted file, wrong path, 403 rules).
- If it is on another domain → a third-party script or font that moved, or a blocked or expired service.
- If it only fails sometimes → an overloaded server or CDN; see Fix: Server errors (5xx).
Fix: basic
- Open the page in Chrome, press F12 and open the Console and Network tabs.
- Reload and filter the Network tab by status (type
status-code:404in the filter box). - Fix or remove each failing file as described in Broken links and resources above.
Fix: expert
Remove an unused script or style that a plugin still enqueues (WordPress, in the child theme’s functions.php):
add_action( 'wp_enqueue_scripts', function () {
wp_dequeue_script( 'old-slider' );
wp_dequeue_style( 'old-slider' );
}, 100 );
Replace old-slider with the handle shown in the page source (id="old-slider-js" means the handle is old-slider).
Platform steps
WordPress
- Deactivate plugins one at a time under Plugins › Installed Plugins to find which one loads the failing file, then update, replace or remove it.
Shopify
- Search Online Store › Themes › … › Edit code for the failing file name and remove or fix the reference.
Verify the fix
- Reload with the Network tab open: no red (failed) rows.
- Click Run again on the audit in Audits. Failed requests should pass.
Automation
Assisted: detection is automatic; removing references needs WordPress admin, Shopify Admin API (theme files) or server SSH.
Common questions
Should I redirect every 404 to the home page?
No. Google treats mass redirects to the home page as soft 404s. Redirect a dead URL only to the closest matching live page. If nothing matches, let it return 404 (or 410) and remove the links that point to it.
Why does a link show as broken when it opens fine in my browser?
The crawler got a 4xx answer at crawl time. Common reasons: the page needs a login, a firewall answered 403 to our crawler, the URL differs by case or a trailing slash, or the page was fixed after the crawl. Click Crawl again to re-check.
Are broken external links counted in this issue?
No. Broken internal links (4xx) only counts links to pages on the same site. External links appear in the Links tab with type External.
What is the difference between 404 and 410?
Both tell Google the page is gone. 410 Gone says it is gone on purpose and Google drops it a little faster. Use 410 for content you removed for good and have no replacement for.
Related articles
- Crawl a whole website
- Fix: HTTPS, SSL and redirects (redirect chains, mixed content)
- Fix: images — broken images, alt text and file size
- Fix: orphan pages and internal links
- Fix: Server errors (5xx) — 500, 502, 503, 504
Still need help?
Ask in the chat inside the app, or send us a message on the contact page. You can also browse all help topics.