Настройка редиректов
Различные способы настройки редиректов.
Al-Sher
Всем привет. В данной записи я хотел бы рассказать про различные методы перенаправления пользователей на другие страницы. Ну а для начала хочу рассказать о том, как это вообще происходит. Для перенаправления сервер передает браузеру специальный http-код, имеющий маску типа 3??, где вместо ? может быть любая цифра. То есть http-коды ответов, начинающиеся с 3, были зарезервированы для перенаправления. Вот их описание:
- 300 Multiple Choices - данный код говорит браузеру о том, что запрашиваемая страница имеет несколько представлений. Данный код используется очень редко, так как стандартный выбор ответа не существует.
- 301 Moved Permanently - данный код говорит браузеру о том, что запрашиваемая страница перемещена навсегда. Поисковики обновляют данные ссылки на новые, указанные сервером, а браузер просто переводит пользователя на новую страницу.
- 302 Moved Temporarily - данный код говорит браузеру о том, что запрашиваемая страница перемещена временно. Поисковики не обновляют ссылки по данным url, а браузер просто переводит пользователя на новую страницу.
- 303 See Other - данный код говорит браузеру о том, что запрашиваемая страница может быть найдена по другому адресу. Запрос после 303 http-кода всегда должен отправляться методом GET.
- 304 Not Modified - данный код говорит браузеру о том, что запрашиваемая страница не обновлялась с момента, указанного в заголовке If-Modified-Since. Данный http-код отправляется с пустым телом.
- 305 Use Proxy - данный код говорит браузеру о том, что запрашиваемая страница доступна с использованием указанного прокси-сервера.
- 306 Unused - данный код использовался в старых версиях http-протоколов. В данный момент данный код никак не используется.
- 307 Temporary Redirect - данный код говорит браузеру о том, что запрашиваемая страница перемещена временно. Принцип работы похож на 302 код, но он гарантирует, что метод и тело запроса не будут изменены при выполнении перенаправления. Это помогает при осуществлении POST запросов.
- 308 Permanent Redirect - данный код говорит браузеру о том, что запрашиваемая страница перемещена навсегда. Принцип работы похож на 301 код, но он гарантирует, что метод и тело запроса не будут изменены при выполнении перенаправления. Это помогает при осуществлении POST запросов.
Наиболее часто встречаемым для меня является редирект 302. Начнем создание данных редиректов! 🙂
Методы html.
В html существует специальный meta-тег, который осуществляет редирект пользователя на другую страницу. Выглядит он следующим образом:
<meta content="0; url=./new.html" http-equiv="refresh"></meta>
В данном коде мы перенаправляем пользователя на страницу ./new.html. Число 0 указывает на время, через которое пользователь будет перемещен на другую страницу. Например, используя код:
<meta content="5; url=./new.html" http-equiv="refresh"></meta>
Пользователь будет перемещен на ./new.html через 5 секунд после загрузки страницы. Данный способ не рекомендован для использования, а так же негативно воспринимается поисковыми системами. Но, если нет другого способа совершить редирект, а он нужен, думаю, это будет хорошей альтернативой. Можно так же обернуть его в noscript, что позволит совершить указанный редирект пользователям без javascript.
Методы javascript.
Используя javascript, мы так же можем совершить перенаправление пользователя на другую страницу. Для этого можно воспользоваться следующим способом:
window.location.href = "./new.html";
То есть редирект осуществляется путем изменения параметра location у объекта window. Если необходимо осуществлять редирект спустя некоторое время, то можно воспользоваться функцией setTimeout и тогда код примет следующий вид:
setTimeout(() => {window.location.href = "./new.html";}, 5000);
В данном случае пользователь будет перемещен на ./new.html через 5 секунд после загрузки сайта. Недостатком данного способа является отсутствие перенаправления пользователей, у которых отключен javascript.
Методы php.
Используя php мы можем передавать браузеру нужный нам http-код. Для этого существует функция header. Пример перенаправления пользователя:
header("Location: ./new.html");
Данный код перенаправит пользователя, используя 302 http-код. Указав в данную функцию дополнительные параметры, мы можем изменить http-код на необходимый нам. Например, осуществим 301 редирект:
header("Location: ./new.html", true, 301);
Если нам необходимо осуществить перемещение пользователя спустя некоторое время, то нам необходим следующий код:
header("Refresh: 5; url=./new.html");
Данный код осуществит перемещение пользователя на страницу ./new.html через 5 секунд после загрузки страницы. Данный способ очень удобен для использования, так как позволяет указывать необходимый нам http-код, а так же помогает поисковикам понять тип редиректа.
Методы nginx.
Мы можем осуществлять редиректы, используя nginx. Данный метод осуществляется в основном для перенаправления пользователей на защищенную версию сайта(https) или наоборот(на http). Используя nginx, мы можем осуществить перенаправление пользователей двумя способами:
- rewrite
- return
Пример использования rewrite:
rewrite /index.html ./new.html;
Если нам необходимо добавить 301 или 302 http-код, то необходимо дописать к коду выше permanent или redirect соответственно. Например, для 301 http-кода запрос будет выглядеть так:
rewrite /index.html ./new.html permanent;
Пример использования return:
return 301 ./new.html;
Как видно, в данном случае мы обязательно указываем http-код. Повторим редирект с /index.html на ./new.html, используя return:
location /index.html {
return 301 ./new.html;
}
Ну и раз выше я говорил про перенаправление пользователей на защищенную версию сайта(https), то сразу приведу и пример кода:
server {
listen 80;
server_name domain.ru;
return 301 https://domain.ru/$request_uri;
}
Методы apache.
В Apache используется модуль mod_rewrite, отвечающий за перенаправление пользователей. Поэтому перед использованием apache для редиректов, необходимо загрузить модуль:
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
А так же разрешить использование данного модуля в .htaccess:
AllowOverride all
В самом файле .htaccess нам необходимо всегда указывать `RewriteEngine On`. Пример использования перенаправления пользователя:
RewriteEngine On
Redirect 301 /index.html ./new.html
Данный код перенаправит пользователя со страницы index.html на страницу new.html с http-кодом 301.
Данный модуль дает возможность использовать специальные правила, указанные в RewriteCond. С помощью данных правил, мы можем осуществлять редирект на безопасную версию сайта. Вот пример кода для такого перенаправления:
RewriteEngine On
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://domain.ru/$1 [R=301,L]
Заключение.
В качестве заключения хочу лишь сказать, что различные методы перенаправления используются в различных случаях. Например, перенаправление на защищенную версию сайта или на поддомен www лучше всего осуществлять с помощью правил nginx или apache. А вот перенаправление пользователей с какой-либо страницы после совершения какого-либо действия удобнее осуществлять с помощью javascript. В случае, когда нет доступа к конфигурации веб-сервера, намного удобнее использовать php или javascript. Meta-теги для перенаправления следует использовать лишь в крайних случаях.