Робимо 301 редирект різними способами, softodom - блог про програмування, софт, інтернеті і it

У цьому пості я розповім про всі ці способи. Описувати методи 301 редиректу буду в такій же послідовності, що і привів їх вище.

301 редирект в файлі .htaccess

Редирект з допомогою директиви Redirect або RedirectPermanent модуля mod_alias

В цьому випадку вказувати код статусу не потрібно, він вже жорстко вбитий для директиви RedirectPermanent.

Редирект з допомогою директиви RedirectMatch

Редирект з допомогою директиви RewriteRule модуля mod_rewrite

Перенаправлення домену з www на НЕ-www

Це універсальний спосіб, який діє завжди і код не треба виправляти для кожного конкретного сайту, дуже зручно. Директивою + FollowSymLinks змушуємо дозволяємо сервера віддавати файли, які фізично знаходяться за межами wwwroot директорії, але на які є ярлики / посилання (symbolic link). Далі включаємо RewriteEngine. Описуємо умова для наступного правила, в даному випадку беремо HTTP_HOST із запиту і дивимося чи є у нього спочатку префікс www. якщо так то застосовується наступного правило описане в директиві RewriteRule. а саме, всі запити перенаправяются такий же домен але вже без префікса www. прапор R каже, що потрібно использвать 301 редирект, а L нарікає на те, що це останнє правило для виконання. У формуванні нового URL для редиректу в директиві RewriteRule змінна підстановки% 1 бере доменне ім'я без www з рядка RewriteCond. тобто все, що укладено в круглі дужки, туди ім'я хоста підставляється з внутрішньої змінної сервера Apache%. яка, в свою чергу береться із запиту клієнта, а змінна строкових GET параметрів запиту $ 1 в діретіве RewriteRule береться з тієї ж рядки, але перший аргумент, там де описано регулярне вираження параметрів запиту, точніше в кінцеву змінну потрапляє все укладену в круглі дужки регулярного виразу перший аргумент.

Так само є і альтернативний, більш зрозумілий, але не універсальний синтаксис перенаправлення домену з www на домен без www.

До речі, я такий безглуздий синтаксис довгий час використовував на своїх сайтах, коли не знав, що в директиві RewriteRule за допомогою змінної% 1 можна динамічно отримати ім'я хоста без www з попередньої директиви RewriteCond. Через це доводилося правити файл .htaccess для кожного домена, дуже клопітно справу коли багато сайтів, простіше використовувати варіант який я навів першим в цьому прикладі, там все універсально.

Редирект запитів з не-www на домен з www префіксом

Тепер припустимо зворотну ситуацію, на треба перенправлять на домен з префіксом www. Виходячи з вище наведених прикладів і описів не важко здогадатися як це зробити.

або ж альтернативний, універсальний варіант:

Якщо ім'я хоста починається не з www то редирект на запитаний хост і додаємо префікс www з точкою вначало.

Редирект за допомогою серверного скрипта (відправлення HTTP заголовків)

Редирект можна здійснювати також за допомогою серверних скриптів, відправляючи клієнтові необхідні заголовки перенаправлення:

Власне все, що нам потрібно зробити в коді скрпітов, це передати дані HTTP заголовки клієнту.

Відправка HTTP заголовків редиректу на мові PHP

Для відправки заголовків в мові програмування PHP в базовій бібліотеці є спеціальна функція з однойменною назвою header. В якості єдиного сатиричного параметра вони приймає заголовок, який згодом віддасть клієнтові. Кожен заголовок потрібно укзано в окремому виконанні функції бо вона топравляет їх тільки по одному. Важливо викликати цю функцію до ночала відправки будь-яких даних клієнта тому HTTP заголовки завжди відправляються на самому початку ще до тіла сторінки.

Ось і весь 301 перший редирект реалізований на PHP!

Відправка HTTP заголовків редиректу на ASP

Практично все те ж саме.

Відправка HTTP заголовків редиректу на ASP.NET

Тут синтаксис дуже схожий зі звичайним ASP.