- URLs should be entirely lowercase to prevent duplicate content issues
- Most web servers treat /Page and /page as different URLs, creating duplicates
- Redirect uppercase and mixed-case URLs to their lowercase equivalents with 301
- Apply lowercasing in your server config or framework router, not ad hoc
Rule Details
URL paths on the web are case-sensitive by specification in RFC 3986 (opens in new tab). While many servers normalize case for you, inconsistent casing creates duplicate pages that split PageRank and often needs the same cleanup plan as canonical URL consolidation.
Code Example
On Linux servers (used by most web hosts), /Products and /products are genuinely different URLs. Both may be served, indexed separately, and compete against each other:
https://example.com/Products/shoes → 200 OK ← duplicate
https://example.com/products/shoes → 200 OK ← canonical-urlEven on Windows/macOS (case-insensitive), Googlebot treats them as separate URLs.
Why It Matters
Mixed-case URLs can create duplicate content. Search engines may index both /Product and /product as separate pages, splitting link equity and diluting rankings, which is why Google's URL structure best practices (opens in new tab) still recommend simple, normalized paths.
Correct Pattern
✅ https://example.com/products/running-shoes
✅ https://example.com/blog/how-to-pick-shoes
✅ https://example.com/about-us
❌ https://example.com/Products/Running-Shoes
❌ https://example.com/Blog/How-To-Pick-Shoes
❌ https://example.com/About-UsServer-Level Fix
Nginx:
# Redirect uppercase URLs to lowercase
if ($uri != $uri_lower) {
rewrite ^(.*)$ $uri_lower permanent;
}Apache (.htaccess):
RewriteEngine On
RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]Framework-Level Fix
Next.js — next.config.js:
module.exports = {
async redirects() {
return [
{
source: '/Products/:path*',
destination: '/products/:path*',
permanent: true,
},
]
},
}Express.js middleware:
app.use((req, res, next) => {
const lower = req.path.toLowerCase()
if (req.path !== lower) {
return res.redirect(301, lower + (req.search || ''))
}
next()
})Sitemap and Internal Links
After enforcing lowercase URLs, audit with Screaming Frog (opens in new tab) or an equivalent crawler:
- XML sitemap entries — all
<loc>values must be lowercase - Internal
<a href="">links — update any uppercase links - Canonical tags —
<link rel="canonical">must match the lowercase URL
If uppercase URLs currently have inbound links or are indexed, implement 301 redirects before removing the old URLs. Dropping uppercase URLs without redirects destroys existing link equity.
Exceptions
- Staging, utility, login, account, or internal search pages may intentionally use different crawl or index signals if they are not meant to rank.
- Temporary migration states can produce noisy intermediate signals; flag the live production URL pattern, not one-off transition artifacts.
- When redirects, canonicals, robots directives, or indexability signals conflict, fix the strongest final signal first instead of reporting every downstream symptom as a separate blocker.
Standards
- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.
- Check the implementation against Google Search Central: URL structure best practices before treating the rule as satisfied.
- Check the implementation against RFC 3986: URI syntax — case normalization before treating the rule as satisfied.
Verification
Automated Checks
- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.
- Test the affected URL with Google Search Console or equivalent tooling where relevant.
- Re-crawl a representative page set after deployment.
Manual Checks
- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.
Use with AI
Copy these prompts to use with your AI assistant, or install the MCP server to use directly from Claude, Cursor, or Windsurf.
Check
Verify implementation
Scan the site's internal links and server-side routes for URLs containing uppercase letters. Check HTTP response codes for uppercase variants of key URLs to confirm whether they redirect (301) to lowercase.
Fix
Auto-fix issues
Configure your server or framework to normalize all incoming URLs to lowercase before routing. Add 301 redirects from any existing uppercase URLs to their lowercase equivalents. Update internal links and sitemaps to use only lowercase URLs.
Explain
Learn more
URL case matters for SEO because case-sensitive servers treat /Page and /page as different resources, creating duplicate content. Even on case-insensitive servers, inconsistency confuses crawlers and splits PageRank across URL variants.
Review
Code review
Scan the site's route definitions, server configuration, and internal links for uppercase letters in URL paths. Test key URLs in uppercase and mixed case — verify they return 301 to the lowercase version, not 200. Check the sitemap for any uppercase <loc> entries. Verify framework router is configured to normalize URL case.
