301-редиректи: Bash і .htaccess для сайтів-мільйонників
301-редиректи на сайті з мільйоном сторінок — це вже не питання «додати правило в .htaccess», а питання архітектури. Ручний список редиректів на такому масштабі неможливо підтримувати: він росте швидше, ніж встигаєш його оновлювати. Розбираємо, як автоматизувати процес через Bash-скрипти й патерни замість переліку URL.

301-редиректи: чому мільйонники — інша задача
На невеликому сайті список редиректів — це файл на 50-100 рядків, який рідко змінюється. На каталозі з мільйоном товарів URL змінюються постійно: категорії перейменовуються, товари знімаються з продажу, структура еволюціонує.
Патерни замість переліку URL
Замість тисяч індивідуальних рядків — regex-правила через mod_rewrite, що покривають цілі класи змін:
RewriteRule ^old-category/(.*)$ /new-category/$1 [R=301,L]Bash-автоматизація масової генерації
Коли структура міняється хаотично (не за єдиним патерном), редиректи генеруються скриптом з таблиці «старий URL → новий URL»:
- вивантажити список змінених URL з CMS чи бази даних;
- Bash/Python-скрипт формує готовий блок правил
.htaccessабо конфіг Nginx; - автоматична перевірка на дублі й конфлікти правил перед деплоєм.
Продуктивність: де ставити редиректи
На мільйоннику тисячі правил у .htaccess сповільнюють кожен запит, бо Apache перевіряє їх послідовно. Для великих обсягів ефективніше:
- редиректи на рівні застосунку (БД-таблиця «старий → новий») замість файлу конфігурації;
- Nginx map-блоки замість лінійних regex-правил, якщо є доступ до конфігурації сервера.
Тестування перед масовим деплоєм
Перед застосуванням масового блоку редиректів — обов’язкова перевірка на вибірці URL, що жоден редирект не веде в нескінченний цикл чи на 404. Логіка перегукується з SEO-міграцією, де редиректи — критичний етап.
Наш підхід на практиці
Ми будуємо систему редиректів на основі патернів і БД-таблиць замість ручних списків — так, щоб вона масштабувалася разом із сайтом.
Часті питання
Бо на сайті з мільйоном сторінок URL змінюються постійно, і ручний список неминуче застаріває, накопичує конфлікти правил і сповільнює сервер через послідовну перевірку тисяч рядків у .htaccess.
Через Bash або Python-скрипт, що бере таблицю «старий URL → новий URL» з бази даних чи CMS і формує готовий блок правил, з автоматичною перевіркою на дублі й конфлікти перед деплоєм.
Для великих обсягів ефективніше зберігати редиректи в таблиці бази даних або використовувати Nginx map-блоки, оскільки тисячі правил у .htaccess послідовно перевіряються Apache і сповільнюють кожен запит.
Мільйон сторінок вимагає системи редиректів, а не списку.
Патерни й автоматична генерація масштабуються разом із сайтом — на відміну від ручного переліку URL.