Chapter 4 ← Back to Guide

Hidden Duplicate URLs That Are Hurting Your SEO

Your website might be serving the same content at multiple URLs without you knowing. Try our free checker tool to find out.

5 min read + interactive tool

The Discovery

We were cleaning up old subdomains for a client when we noticed something unexpected: their website was serving identical page content at two different URLs. The “About” page loaded at both /about and /index.php/about.

Same content. Same design. Two different addresses. Google sees that as two separate pages competing against each other.

We tested five other sites running the same framework. Three out of five had the same problem. And here’s the thing—this isn’t a bug unique to one platform. It’s a common configuration oversight that affects WordPress, Laravel, CodeIgniter, and dozens of other frameworks.

Most site owners have no idea it’s happening. So we built a free checker tool (below) that tests your site for all four duplicate URL patterns in seconds.

Why Duplicate URLs Matter

When the same content lives at multiple URLs, three things go wrong:

Authority Gets Diluted

When other sites link to your page, some might link to /about and others to /index.php/about. Instead of one page with 10 backlinks, you have two pages with 5 each. Neither ranks as well as the consolidated version would.

Crawl Budget Gets Wasted

Google allocates a certain amount of crawling resources to your site. Every duplicate URL it discovers is a URL it crawls instead of your actual unique content. For small sites this is minor; for larger sites it can mean important pages get crawled less frequently.

Google Has to Guess

When duplicates exist, Google picks which URL to show in search results. It might pick the ugly /index.php/ version, or the HTTP version instead of HTTPS. You lose control of how your site appears in search.

Four Common Duplicate URL Patterns

These are the four patterns we see most often. Your site might have one, several, or all of them.

1. The index.php Ghost

Most modern web frameworks use index.php as a “front controller”—every request passes through it behind the scenes. The problem: if the server isn’t configured to hide it, both URLs work:

yoursite.com/about
yoursite.com/index.php/about

2. www vs. Non-www

If both versions resolve and neither redirects to the other, Google sees two separate sites:

www.yoursite.com/about
yoursite.com/about

3. HTTP vs. HTTPS

You installed an SSL certificate—great. But if the HTTP version still serves content instead of redirecting, it’s a duplicate:

https://yoursite.com/about
http://yoursite.com/about

4. Trailing Slash Mismatch

Some servers treat these as the same page, others as two different pages:

yoursite.com/about
yoursite.com/about/

Check Your Site

Enter any page URL from your website and we’ll test all four patterns in real time.

How to Fix Each Issue

Each fix goes in your .htaccess file (Apache) or server configuration (Nginx). The key principle: pick one canonical version and 301 redirect everything else to it.

Fix: index.php Ghost

Redirect any URL containing /index.php/ to the clean version:

# Redirect index.php URLs to clean URLs
RewriteEngine On
RewriteCond %{THE_REQUEST} /index\.php/ [NC]
RewriteRule ^index\.php/(.*)$ /$1 [R=301,L]

Fix: www vs. Non-www

Pick one and redirect the other. This example redirects www to non-www:

# Redirect www to non-www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Fix: HTTP to HTTPS

Force all traffic to HTTPS:

# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Fix: Trailing Slash

This example removes trailing slashes (the more common convention for static sites):

# Remove trailing slashes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]

Order matters. Place HTTPS and www redirects first, then index.php, then trailing slash. That way each request only gets redirected once instead of bouncing through multiple redirects.

The Canonical Tag Safety Net

Server-side redirects are the real fix. But as a backup, every page should include a <link rel="canonical"> tag in the <head>:

<link rel="canonical" href="https://yoursite.com/about">

This tells Google: “No matter how you found this page, this is the URL I want you to index.” It’s a hint, not a directive—Google can ignore it—but it’s a strong signal and catches edge cases your redirects might miss.

Important: The canonical URL must be the full, absolute URL including the scheme (https://) and your preferred hostname (with or without www). A relative path like /about won’t work correctly.

The Bottom Line

Duplicate URLs are one of those SEO problems that fly under the radar because everything looks fine. Your site loads, your pages work, your content is there. But behind the scenes, Google is seeing two (or more) versions of every page and splitting your authority between them.

The fix is straightforward: pick one canonical URL pattern, redirect everything else with 301s, and add canonical tags as a safety net. It’s a one-time configuration change that pays dividends permanently.

Run the checker above on your own site. You might be surprised what you find.

Need Help Cleaning Up Duplicate URLs?

We’ll audit your site for duplicate content issues, implement the server-side fixes, and verify everything is redirecting correctly. No jargon, no long-term contracts.

Get a Free Consultation