When the user wants to configure canonical URLs, fix duplicate content, or consolidate URL signals. Also use when the user mentions "canonical," "canonical URL," "duplicate content," "duplicate content fix," "preferred URL," or "URL consolidation." For GSC duplicates, use google-search-console.
Guides canonical tag configuration to consolidate duplicate content and declare preferred URLs.
When invoking: On first use, if helpful, open with 1–2 sentences on what this skill covers and why it matters, then provide the main output. On subsequent use or when the user asks to skip, go directly to the main output.
Check for project context first: If .claude/project-context.md or .cursor/project-context.md exists, read it for site URL and language structure.
Identify:
| Method | When | Strength | |--------|------|----------| | 301 redirect | Preferred; server can redirect | Strongest — permanent redirect | | Canonical tag | Cannot redirect (e.g. params, pagination) | Strong — HTML signal | | robots.txt | Block non-canonical paths | Weak — advisory only |
Use 301 for HTTP→HTTPS, www variants, trailing slash. Use canonical for params, pagination, UTM.
HTTPS is a ranking signal (Google, 2014). Users and crawlers should access only the HTTPS version.
| Requirement | Action |
|-------------|--------|
| SSL/TLS certificate | Install valid certificate; use Let's Encrypt for free |
| 301 redirect | HTTP → HTTPS; all HTTP requests redirect to HTTPS |
| Mixed content | No HTTP resources on HTTPS pages; fix mixed content warnings |
| HSTS | Optional; Strict-Transport-Security header for repeat visitors |
WWW vs non-WWW: Choose one preferred version; 301 redirect the other. See canonical rules above.
| Rule | Note |
|------|------|
| Absolute URL | Include https:// |
| Consistency | Must match current page URL or the chosen preferred version |
| No chains | A→B→C is invalid |
export const metadata = {
alternates: {
canonical: "https://example.com/page-slug",
languages: {
zh: "https://example.com/zh/page-slug",
en: "https://example.com/page-slug",
"x-default": "https://example.com/page-slug",
},
},
};
<link rel="canonical" href="https://example.com/page-slug" />
Apache (.htaccess):
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Nginx:
return 301 https://$host$request_uri;
Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/canonical · pinned to the source commit
git clone https://github.com/kostja94/marketing-skills.git
cd marketing-skills
git checkout 70987bad4ebe9dce1f74858c1c64f3f8810f18e4
mkdir -p ".claude/skills/canonical"
cp -r "skills/seo/technical/canonical" ".claude/skills/canonical"Review the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
Scanner static-checks@0.1.0 · commit 70987bad4ebe. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.