HTTPQUERY
Русский

Location

Применение

Серверы включают Location, когда направляют клиентов на другой URL. Этот заголовок встречается в двух контекстах: в ответах-перенаправлениях и при создании ресурса.

При перенаправлениях значение Location сообщает клиенту, куда отправить следующий запрос. Поведение зависит от кода состояния:

При создании ресурса ответ 201 Created включает Location, указывающий на вновь созданный ресурс. Это даёт клиенту прямую ссылку без необходимости выполнять дополнительный поиск.

Значение Location принимает как абсолютные, так и относительные URL. Относительные URL разрешаются относительно URI запроса.

Примечание

Заголовок Location и заголовок Content-Location служат разным целям. Location указывает на цель перенаправления или на вновь созданный ресурс. Content-Location определяет прямой URL возвращённого представления.

Примечание

Поисковые системы следуют за перенаправлениями и передают ссылочный вес (ранжирующую ценность) целевому URL при постоянных перенаправлениях (301, 308). Временные перенаправления (302, 307) передают ссылочный вес не всегда. Использование правильного кода состояния при миграции URL сохраняет позиции в поиске.

URL

Значение — одна URI-ссылка, указывающая на целевое местоположение.

Location: <url>

URL — это либо абсолютный URI со схемой и хостом, либо относительная ссылка, разрешаемая относительно URI запроса.

Пример

Постоянное перенаправление со старого домена на новый сообщает клиентам, что нужно обновить закладки и ссылки. При 301 клиентам разрешается сменить метод запроса с POST на GET.

HTTP/1.1 301 Moved Permanently
Location: https://new.example.re/products

Постоянное перенаправление 308 сохраняет исходный метод запроса, благодаря чему перенаправление безопасно для POST и других запросов, отличных от GET.

HTTP/1.1 308 Permanent Redirect
Location: https://new.example.re/products

После создания ресурса через запрос POST сервер возвращает 201 и Location нового ресурса.

HTTP/1.1 201 Created
Location: /api/orders/7891
Content-Type: application/json

Ответ 303 после отправки формы перенаправляет клиента на страницу результатов с использованием GET.

HTTP/1.1 303 See Other
Location: /search/results?q=http+headers

Диагностика

Сбои перенаправления часто проявляются как бесконечные циклы, неработающие URL или отсутствующие заголовки в ответе.

Цикл перенаправлений. Заголовок Location указывает обратно на текущий URL или на другой URL, который перенаправляет назад, образуя бесконечный цикл. Браузеры останавливаются после заданного числа переходов и показывают ошибку ERR_TOO_MANY_REDIRECTS. Проследите цепочку с помощью curl -L -v, чтобы выявить цикл. Распространённые причины: серверное правило перенаправляет HTTP на HTTPS, тогда как балансировщик нагрузки перенаправляет HTTPS обратно на HTTP, либо правила nginx return 301 совпадают с целевым URL. В nginx применяйте ограждение if ($scheme = http) узко и тестируйте оба протокола.

Относительный URL разрешается неправильно. Значение Location принимает относительные ссылки, но некоторые старые клиенты и промежуточные узлы ожидают абсолютный URL. Путь вида /new-page разрешается относительно URI запроса. Пропуск ведущей косой черты создаёт относительный путь, который разрешается относительно текущего каталога, что приводит к неожиданным результатам. Используйте абсолютные URL со схемой и хостом, чтобы избежать неоднозначности.

Отсутствующий заголовок Location в ответе 3xx. Код состояния перенаправления без заголовка Location оставляет клиента без пункта назначения. Браузеры показывают пустую страницу или ошибку. Проверьте ответ сервера командой curl -I https://example.re/old-path и убедитесь, что заголовок присутствует. В Apache директивы Redirect и RedirectMatch всегда включают этот заголовок. Собственный код приложения должен устанавливать заголовок явно.

Несовпадение протокола в цели перенаправления. HTTP-адрес в заголовке Location на HTTPS-сайте вызывает предупреждения о смешанном содержимом или блокирует перенаправление в строгих окружениях. Убедитесь, что целевой URL соответствует исходному протоколу или повышает его до HTTPS. В nginx используйте return 301 https://$host$request_uri;, чтобы сохранить защищённую схему.

Фрагмент не сохраняется при перенаправлениях. Идентификатор фрагмента (#section) из исходного URL не передаётся в заголовке Location. Браузеры заново прикрепляют исходный фрагмент к цели перенаправления только тогда, когда целевой URL не содержит собственного фрагмента. Если значение Location включает другой фрагмент, исходный теряется. Серверный код не имеет доступа к фрагментам, поскольку браузеры не отправляют их в запросах.

Отладка цепочек перенаправлений. Выполните curl -L -v https://example.re/start, чтобы пройти по всем перенаправлениям и увидеть каждый переход с кодами состояния и заголовками. Вкладка Network в DevTools также показывает полную цепочку. Отфильтруйте по типу «документ», чтобы отделить ответы-перенаправления от запросов подресурсов.