Перенаправления
Перенаправления в HTTP
Перенаправление URL, также известное как переадресация URL, — это способ назначить несколько адресов URL странице, форме, целому веб-сайту или веб-приложению. Для этой операции в HTTP предусмотрен особый тип ответа — перенаправление HTTP.
Перенаправления решают множество задач:
- Временные перенаправления на время обслуживания сайта или его недоступности
- Постоянные перенаправления, чтобы сохранить существующие ссылки и закладки после изменения URL сайта, отображать страницы с ходом выполнения при загрузке файла и т. д.
Принцип работы
В HTTP перенаправление запускается сервером, отправляющим в ответ на запрос специальный ответ перенаправления. Ответы перенаправления имеют коды состояния, начинающиеся с 3, и заголовок Location, содержащий URL для перенаправления.
Получив перенаправление, браузеры немедленно загружают новый URL, указанный в заголовке Location. Помимо небольшого снижения производительности из-за дополнительного обмена данными, пользователи редко замечают перенаправление.
Существует несколько типов перенаправлений, разделённых на три категории:
Постоянные перенаправления
Такие перенаправления рассчитаны на длительное использование. Они означают, что исходный URL больше не следует использовать и его нужно заменить новым. Поисковые роботы, программы для чтения RSS и другие средства обхода обновят исходный URL ресурса.
| Код | Текст | Обработка метода | Типичный сценарий использования |
|---|---|---|---|
301 | Moved Permanently |
Методы GET остаются без изменений. Другие методы могут быть заменены на GET. [1] | Реструктуризация веб-сайта. |
308 | Permanent Redirect | Метод и тело запроса не изменяются. | Реструктуризация веб-сайта с использованием ссылок или операций, отличных от GET. |
[1] В спецификации не предполагалось разрешать изменение метода, однако существующие пользовательские агенты могут его менять. 308 был создан, чтобы устранить неоднозначность поведения при использовании методов, отличных от GET.
Временные перенаправления
Иногда запрошенный ресурс недоступен по своему каноническому адресу, но доступен в другом месте. В этом случае можно использовать временное перенаправление.
Поисковые роботы и другие средства обхода не запоминают новый временный URL. Временные перенаправления также используются при создании, обновлении или удалении ресурсов для отображения временных страниц с ходом выполнения.
| Код | Текст | Обработка метода | Типичный сценарий использования |
|---|---|---|---|
302 | Found |
Методы GET остаются без изменений. Другие методы могут быть заменены на GET. [2] | Веб-страница временно недоступна по непредвиденным причинам. |
303 | See Other |
Методы GET остаются без изменений. Другие методы заменяются на GET (тело запроса теряется). | Используется для перенаправления после запроса PUT или POST, чтобы обновление страницы с результатом не запускало операцию повторно. |
307 | Temporary Redirect | Метод и тело запроса не изменяются | Веб-страница временно недоступна по непредвиденным причинам. Предпочтительнее 302, если на сайте доступны операции, отличные от GET. |
[2] В спецификации не предполагалось разрешать изменение метода, однако существующие пользовательские агенты могут его менять. 307 был создан, чтобы устранить неоднозначность поведения при использовании методов, отличных от GET.
Специальные перенаправления
304 (Not Modified) перенаправляет страницу на локально сохранённую копию (которая устарела), а 300 (Multiple Choices) — это ручное перенаправление: тело ответа, отображаемое браузером как веб-страница, содержит список возможных перенаправлений, и пользователь нажимает на одно из них.
| Код | Текст | Типичный сценарий использования |
|---|---|---|
300 | Multiple Choices | Используется нечасто: варианты перечисляются в HTML-странице в теле ответа. Машиночитаемые варианты рекомендуется отправлять в заголовках Link с помощью rel=alternate. |
304 | Not Modified | Отправляется в ответ на условные запросы с повторной проверкой. Указывает, что кешированный ответ всё ещё актуален и его можно использовать. |
Альтернативные способы указания перенаправлений
Перенаправления HTTP — не единственный способ задать перенаправления. Есть ещё два способа:
Перенаправления HTML
Перенаправления HTTP — лучший способ настроить перенаправления, но иногда у вас нет доступа к серверу. В таком случае попробуйте использовать элемент <meta> с атрибутом http-equiv, заданным в значение Refresh, внутри элемента <head> страницы. При отображении страницы браузер перейдёт по указанному URL.
<head> <meta http-equiv="Refresh" content="0; URL=https://example.com/" /> </head>
Атрибут content должен начинаться с числа, указывающего, сколько секунд браузеру следует подождать перед переходом по указанному URL. Для соответствия требованиям доступности всегда задавайте значение 0.
Очевидно, этот метод работает только с HTML и не может использоваться для изображений или других типов содержимого.
Перенаправления JavaScript
Перенаправления в JavaScript выполняются путём присваивания строки URL свойству window.location, что приводит к загрузке новой страницы:
window.location = "https://example.com/";
Как и перенаправления HTML, этот способ работает не со всеми ресурсами и, очевидно, только в клиентах, выполняющих JavaScript. С другой стороны, он предоставляет больше возможностей: например, можно запускать перенаправление только при выполнении определённых условий.
Порядок приоритета
Существует три способа запускать перенаправления, и несколько из них могут использоваться одновременно. Но какой из них будет применён первым?
- Перенаправления HTTP выполняются всегда первыми — они существуют, даже когда страница ещё не передана.
- Несколько неожиданно, перенаправления JavaScript выполняются следующими, до перенаправлений HTML. Это происходит потому, что перенаправление
<meta>выполняется после полной загрузки страницы, то есть после выполнения всех скриптов. - Перенаправления HTML (
<meta>) выполняются, если до загрузки страницы не сработали перенаправления HTTP или JavaScript. - Если перенаправление JavaScript выполняется после загрузки страницы (например, при нажатии кнопки), оно сработает последним, если страница ещё не была перенаправлена предыдущими способами.
По возможности используйте перенаправления HTTP и не добавляйте перенаправления с помощью элемента <meta>. Если кто-то изменит перенаправления HTTP, но забудет изменить перенаправления HTML, они перестанут совпадать, что может привести к бесконечному циклу или другим неприятностям.
Сценарии использования
У перенаправлений множество сценариев использования, но поскольку каждое перенаправление снижает производительность, их следует использовать как можно реже.
Псевдонимы доменов
В идеале для каждого ресурса существует одно местоположение и, следовательно, один URL. Однако есть причины использовать альтернативные имена ресурса:
- Расширение охвата сайта
-
Распространённый пример: сайт размещён по адресу
www.example.com, но он также должен открываться при переходе по адресуexample.com. Поэтому настраиваются перенаправления сexample.comнаwww.example.com. Можно также настроить перенаправления с распространённых синонимов или часто встречающихся опечаток в доменных именах. - Переход на новый домен
-
Например, ваша компания сменила название, но вы хотите, чтобы существующие ссылки и закладки по-прежнему вели к вам под новым именем.
- Принудительное использование HTTPS
-
Запросы к версии сайта
http://будут перенаправляться на версию сайтаhttps://.
Сохранение работоспособности ссылок
При изменении структуры веб-сайта меняются URL. Даже если вы обновите ссылки на своём сайте, чтобы они соответствовали новым URL, вы не можете контролировать URL, используемые внешними ресурсами.
Вы не хотите, чтобы эти ссылки перестали работать: они приводят ценных пользователей и помогают улучшить SEO. Поэтому настройте перенаправления со старых URL на новые.
Примечание: Этот способ работает и для внутренних ссылок, но старайтесь избегать внутренних перенаправлений. Перенаправление заметно снижает производительность (поскольку выполняется дополнительный HTTP-запрос). Если этого можно избежать, исправив внутренние ссылки, лучше исправить именно их.
Временные ответы на небезопасные запросы
Небезопасные запросы изменяют состояние сервера, и пользователь не должен отправлять их повторно случайно.
Обычно не следует допускать повторной отправки пользователями запросов PUT, POST или DELETE. Если отправить ответ непосредственно на такой запрос, нажатие кнопки обновления повторно отправит запрос (возможно, после сообщения с подтверждением).
В этом случае сервер может отправить ответ 303 (See Other) с URL, по которому будет доступна нужная информация. При нажатии кнопки обновления будет повторно отображена только эта страница, без повторной отправки небезопасных запросов.
Временные ответы на длительные запросы
Обработка некоторых запросов на сервере может занимать больше времени, например запросов DELETE, запланированных на более позднее время. В этом случае сервер отправляет перенаправление 303 (See Other) на страницу, сообщающую о запланированном действии и, в конечном счёте, информирующую о ходе его выполнения или позволяющую отменить его.
Настройка перенаправлений на популярных серверах
>Apache
Перенаправления можно настроить в конфигурационном файле сервера или в файле .htaccess каждого каталога.
Модуль mod_alias содержит директивы Redirect и RedirectMatch, которые по умолчанию настраивают перенаправления 302:
<VirtualHost *:443> ServerName example.com Redirect / https://www.example.com </VirtualHost>
URL https://example.com/ будет перенаправлен на https://www.example.com/, как и любые файлы или каталоги внутри него (https://example.com/some-page будет перенаправлен на https://www.example.com/some-page)
RedirectMatch выполняет ту же задачу, но принимает регулярное выражение, задающее набор затрагиваемых URL:
RedirectMatch ^/images/(.*)$ https://images.example.com/$1
Все документы в каталоге images/ будут перенаправлены на другой домен.
Если вам нужно не временное перенаправление, можно использовать дополнительный параметр (код состояния HTTP или ключевое слово permanent), чтобы настроить другой тип перенаправления:
Redirect permanent / https://www.example.com # …acts the same as: Redirect 301 / https://www.example.com
Модуль mod_rewrite также позволяет создавать перенаправления. Он более гибкий, но немного сложнее.
Nginx
В Nginx для содержимого, которое нужно перенаправить, создаётся отдельный блок сервера:
server {
listen 80;
server_name example.com;
return 301 $scheme://www.example.com$request_uri;
}
Чтобы перенаправить каталог или только определённые страницы, используйте директиву rewrite:
rewrite ^/images/(.*)$ https://images.example.com/$1 redirect; rewrite ^/images/(.*)$ https://images.example.com/$1 permanent;
IIS
В IIS для настройки перенаправлений используется элемент <httpRedirect>.
Циклы перенаправлений
Цикл перенаправлений возникает, когда за уже выполненным перенаправлением следуют новые. Иными словами, образуется бесконечный цикл, и страница никогда не будет найдена.
Чаще всего это проблема сервера, и если сервер сможет её обнаружить, он отправит ответ Internal Server Error 500. Если вы столкнулись с такой ошибкой вскоре после изменения конфигурации сервера, вероятно, возник цикл перенаправлений.
Иногда сервер не может его обнаружить: цикл перенаправлений может охватывать несколько серверов, каждый из которых не располагает полной информацией. В этом случае его обнаружат браузеры и покажут сообщение об ошибке. Firefox отображает:
Firefox обнаружил, что сервер перенаправляет запрос для этого адреса таким образом, что перенаправление никогда не завершится.
…а Chrome отображает:
На этой веб-странице возник цикл перенаправлений
В обоих случаях пользователь мало что может сделать (если только проблема не вызвана чем-то на его стороне, например несоответствием кеша или файлов cookie).
Важно избегать циклов перенаправлений, поскольку они полностью нарушают взаимодействие с пользователем.
См. также
- Ответы со статусом 3XX-перенаправления
-
Заголовок
Location -
Свойство
window.locationдля перенаправления с помощью JavaScript
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Redirections