Fixing Duplicate URLs in Google Search Console

Overview

Google Search Console is showing "Duplicate, Google chose different canonical than user" or "Duplicate without user-selected canonical" in your Coverage report. This means Google found the same content at multiple URLs and is unsure which one to index.

Duplicate URL issues dilute your SEO authority across multiple versions of the same page. Instead of one strong page ranking well, you end up with several weak copies competing against each other.

Common Duplicate Patterns

www vs. Non-www

Both of these URLs resolve and serve the same content:

https://www.example.com/about
https://example.com/about

Diagnosis: Try both in your browser. If they both load without redirecting, you have a duplicate.

# Check if non-www redirects to www (or vice versa)
curl -sI https://example.com/about | grep -i location
curl -sI https://www.example.com/about | grep -i location

If neither returns a Location header with a redirect, both versions are live.

Trailing Slash Inconsistency

These are treated as different URLs by Google:

https://www.example.com/about
https://www.example.com/about/

Diagnosis:

curl -sI https://www.example.com/about | grep -i location
curl -sI https://www.example.com/about/ | grep -i location

If both return 200 with no redirect, Google sees two separate pages with the same content.

Query Parameters

Marketing UTM tags and other query parameters create duplicate versions of every page:

https://www.example.com/pricing
https://www.example.com/pricing?utm_source=twitter
https://www.example.com/pricing?utm_source=newsletter&utm_medium=email
https://www.example.com/pricing?ref=homepage

Google treats each of these as a potentially unique URL.

HTTP vs. HTTPS

https://www.example.com/about
http://www.example.com/about

If your HTTP version does not redirect to HTTPS, search engines may index both. RndrKit handles this automatically -- all HTTP requests are redirected to HTTPS with a 301.

Fixes

Canonical Tags

The canonical tag tells Google which version of a page is the "official" one. Add it to every page in your application.

For React apps using React Helmet:

import { Helmet } from "react-helmet";

function AboutPage() {
  return (
    <>
      <Helmet>
        <link rel="canonical" href="https://www.example.com/about" />
        <title>About Us</title>
      </Helmet>
      <main>
        <h1>About Us</h1>
        {/* page content */}
      </main>
    </>
  );
}

Key rules for canonical tags:

  • Always use the full absolute URL including https:// and your chosen domain format (www or non-www).
  • Use the same format consistently across all pages. If you choose https://www.example.com, every canonical should start with that.
  • Do not include query parameters in the canonical URL unless the parameters change the page content.
  • Place the canonical tag in the <head> of every page, not just pages you think have duplicates.

For Next.js apps:

// app/about/page.tsx
import type { Metadata } from "next";

export const metadata: Metadata = {
  title: "About Us",
  alternates: {
    canonical: "https://www.example.com/about",
  },
};

Redirect Rules

Redirects are stronger than canonical tags because they prevent the duplicate from being accessible at all.

www to non-www (or vice versa):

RndrKit can handle domain-level redirects. In your RndrKit dashboard:

  1. Go to your domain settings.
  2. Under Redirect Rules, add a 301 redirect from www.example.com to example.com (or the reverse, depending on your preference).
  3. Make sure your canonical tags match your chosen format.

For Cloudflare users, you can also set up a Page Rule:

Match: www.example.com/*
Redirect to: https://example.com/$1 (301)

Trailing slash normalization:

Most frameworks handle this at the application level:

  • Next.js: Set trailingSlash: true or trailingSlash: false in next.config.js to enforce one format.
  • React Router / Lovable: Ensure your routes are defined consistently. Use your canonical tags to declare the preferred format.

Consistent Internal Linking

Even with canonical tags and redirects, inconsistent internal links send mixed signals.

Audit your links:

  • Check your navigation component. Does it link to /about or /about/? Pick one and use it everywhere.
  • Check footer links, sitemap links, and any hardcoded URLs in your content.
  • If you link to https://example.com/page in some places and /page in others, the relative links will inherit whatever domain the user is on.

Best practice: Use relative paths (/about) for internal links within your app, and set canonical tags with full absolute URLs. The relative paths ensure links work regardless of domain, while the canonical tags tell Google your preference.

RndrKit and Query Parameters

RndrKit strips query parameters from render log paths automatically, so your analytics are not polluted by UTM variations. However, this does not affect what Google sees.

You still need canonical tags on your pages to tell Google that /pricing?utm_source=twitter is the same as /pricing. The canonical tag on both versions should point to https://www.example.com/pricing (without parameters).

Verifying Your Fixes

After implementing canonical tags and redirects:

# 1. Check that redirects work
curl -sI http://example.com/about | grep -i location
# Expected: Location: https://www.example.com/about (or your chosen format)

# 2. Check canonical tag in pre-rendered HTML
curl -s -A "Googlebot/2.1" "https://www.example.com/about" | grep canonical
# Expected: <link rel="canonical" href="https://www.example.com/about" />

# 3. Verify no trailing slash duplicates
curl -sI https://www.example.com/about/ | grep -i location
# Expected: 301 redirect to /about (or vice versa)

Then in Google Search Console:

  1. Go to URL Inspection and check a few of your previously duplicated URLs.
  2. Monitor the Pages report over the next 2-4 weeks. Duplicate issues will resolve as Google re-crawls.
  3. Use Request Indexing on your canonical URLs to speed up the process.

Next Steps