Розробка системи управління редиректами сайту
Система управління редиректами дозволяє налаштовувати 301/302/307-перенаправлення через інтерфейс CMS без змін конфігурації веб-сервера. Критично важлива при реструктуризації сайту, зміні URL-структури, видаленні сторінок.
Модель даних
redirects (
id, from_path, to_url,
http_code: 301 | 302 | 307,
is_active,
hits, -- кількість срабатувань
last_hit_at, -- дата останнього срабатування
created_by, created_at, note
)
Middleware для редиректів
class HandleRedirects
{
public function handle(Request $request, Closure $next): Response
{
$path = '/' . ltrim($request->path(), '/');
$redirect = Cache::remember('redirect:' . md5($path), 3600, function () use ($path) {
return Redirect::where('from_path', $path)
->where('is_active', true)
->first(['to_url', 'http_code']);
});
if ($redirect) {
Redirect::where('from_path', $path)->increment('hits');
Redirect::where('from_path', $path)->update(['last_hit_at' => now()]);
return redirect($redirect->to_url, $redirect->http_code);
}
return $next($request);
}
}
Middleware реєструється в bootstrap/app.php в групі web з високим пріоритетом.
Імпорт редиректів з CSV
При міграції сайту потрібно завантажити сотні або тисячи редиректів одразу:
public function importFromCsv(UploadedFile $file): array
{
$rows = array_map('str_getcsv', file($file->getRealPath()));
$header = array_shift($rows); // перша строка — заголовки
$created = $skipped = $errors = 0;
foreach (array_chunk($rows, 500) as $chunk) {
$inserts = [];
foreach ($chunk as $row) {
$data = array_combine($header, $row);
if (empty($data['from']) || empty($data['to'])) { $errors++; continue; }
$inserts[] = [
'from_path' => '/' . ltrim($data['from'], '/'),
'to_url' => $data['to'],
'http_code' => $data['code'] ?? 301,
'is_active' => true,
'created_at' => now()
];
$created++;
}
Redirect::upsert($inserts, ['from_path'], ['to_url', 'http_code']);
}
return compact('created', 'skipped', 'errors');
}
Регулярні вирази (опціонально)
Для складних паттернів:
// Redirect з regex: /blog/2023/* → /news/*
$redirect = Redirect::where('from_path', 'LIKE', '/blog/%')
->where('is_regex', true)
->get();
foreach ($redirect as $r) {
if (preg_match($r->from_path, $path, $matches)) {
$to = preg_replace($r->from_path, $r->to_url, $path);
return redirect($to, $r->http_code);
}
}
Визначення битих посилань
Запускати періодично — перевіряти from_path редиректів на наявність вхідних посилань з інших сторінок сайту. Редиректи без вхідних посилань та без срабатувань за 6 місяців — кандидати на видалення.
Час розробки: 2–3 дні для системи з імпортом CSV, кешуванням та інтерфейсом управління.







