Налаштування SEO-дружних URL для вашого сайту
SEO-дружні URL — читабельні, зрозумілі адреси сторінок без технічних параметрів. Вони впливають на CTR у результатах пошуку (користувачі бачать URL у сніпеті), на сприйняття посилання та опосередковано впливають на ранжування.
Принципи хорошого URL
| Погано | Добре |
|---|---|
/product.php?id=4521 |
/products/iphone-15-pro-256gb |
/cat/12/sub/45 |
/catalog/smartphones/apple |
/articles/2024/03/15/post-1 |
/blog/yak-vybrata-noutbuk |
/page?lang=ru&id=about |
/pro-kompaniu |
/Products/Laptops/Dell |
/products/laptops/dell (малі букви) |
Правила:
- Тільки малі букви
- Роздільник — дефіс, не підкреслення
- Без технічних ID (якщо можна обійтися)
- Транслітерація або семантичний переклад англійською
- Логічна ієрархія, що відображає структуру сайту
- Без непотрібних стоп-слів:
the,та,або,для
Транслітерація slug у Laravel
use Illuminate\Support\Str;
// Проста транслітерація через iconv
function translit(string $text): string
{
$text = mb_strtolower($text);
$cyrToLat = [
'а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'yo',
'ж'=>'zh','з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m',
'н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u',
'ф'=>'f','х'=>'kh','ц'=>'ts','ч'=>'ch','ш'=>'sh','щ'=>'shch',
'ъ'=>'','ы'=>'y','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya',
' '=>'-','_'=>'-',
];
$text = strtr($text, $cyrToLat);
return preg_replace('/[^a-z0-9\-]/', '', $text);
}
// У моделі
protected static function boot(): void
{
parent::boot();
static::creating(function (self $model) {
if (empty($model->slug)) {
$model->slug = static::generateUniqueSlug($model->title);
}
});
}
protected static function generateUniqueSlug(string $title): string
{
$slug = translit($title);
$original = $slug;
$count = 1;
while (static::where('slug', $slug)->exists()) {
$slug = "{$original}-{$count}";
$count++;
}
return $slug;
}
Маршрутизація
// Вкладені маршрути для ієрархії
Route::get('/catalog/{category}/{subcategory?}', [CatalogController::class, 'show'])
->where(['category' => '[a-z0-9\-]+', 'subcategory' => '[a-z0-9\-]+']);
Route::get('/catalog/{category}/{subcategory}/{product}', [ProductController::class, 'show'])
->where(['product' => '[a-z0-9\-]+']);
Постійний slug vs. генерований із заголовка
- Фіксований slug — не змінюється при редагуванні заголовка (SEO-переважно, немає розбитих посилань)
- Автоматичний — оновлюється із заголовком (потребує автоматичного редиректа 301 зі старого slug)
Зберігайте історію slug для автоматичних 301-редиректів:
Schema::create('slug_redirects', function (Blueprint $table) {
$table->string('old_slug')->primary();
$table->string('new_slug');
$table->string('model_type');
$table->unsignedBigInteger('model_id');
$table->timestamps();
});
URL для багатомовних сайтів
Варіанти структури:
| Структура | Приклад |
|---|---|
| Піддомен | ru.example.com/products/laptop |
| Префікс шляху | example.com/ru/products/laptop |
| Окремий домен | example.ru/products/laptop |
Для Яндекса, регіональні домени (.ru) переважні. Для Google — будь-який варіант працює, якщо налаштований hreflang.
Паджинація
Переважний формат: /blog/page/2 або /blog?page=2. Другий варіант зручніший — не потребує окремого маршруту, canonical автоматично правильний.
Час налаштування: 1 день для реалізації slug-системи з історією редиректів.







