Setting up canonical URL to prevent duplicates
Canonical URL tells search engines which version of a page is the main one. Content duplicates arise from GET parameters, pagination, www/non-www, http/https, trailing slash — canonical solves this without redirects.
Canonical tag
<link rel="canonical" href="https://example.ru/products/iphone-15-pro">
Typical duplicate scenarios that canonical solves:
| URL (duplicate) | Canonical (main) |
|---|---|
?utm_source=google |
/products/iphone-15-pro |
?sort=price&order=asc |
/products/laptops |
?page=1 |
/blog/ |
http:// version |
https:// version |
www. version |
without www. |
/products/phone/ (trailing slash) |
/products/phone |
Implementation in Laravel
// HasCanonical trait
trait HasCanonical
{
public function getCanonicalUrl(): string
{
return url($this->canonical_path ?? $this->getSlugPath());
}
}
// In Blade template
<link rel="canonical" href="{{ $page->getCanonicalUrl() }}">
For pages with filters — remove all GET parameters:
public function canonicalUrl(Request $request): string
{
return $request->url(); // without query string
}
Canonical for pagination
Page /blog/?page=3 should have canonical to itself (not to the first page) if content is unique:
<link rel="canonical" href="{{ url()->current() }}{{ request('page') > 1 ? '?page=' . request('page') : '' }}">
Self-referencing canonical
On each page set canonical to itself — a good practice. This protects from content syndication (when someone copies your page).
Canonical in HTTP header
For PDF and non-HTML resources:
return response($pdf)
->header('Content-Type', 'application/pdf')
->header('Link', '<https://example.ru/docs/report>; rel="canonical"');
Verification through Google Search Console
URL Inspection Tool shows which canonical Google sees (specified vs detected). If they diverge — Google ignores the specified canonical and chooses its own; eliminate the cause of divergence.
Setup time: a few hours for template implementation.







