Эта статья изначально была написана для блога Бенджамина Кроза.

Чтобы перенаправить пользователей на другую страницу в PHP, используйте функцию header().

Но если вы хотите понять, что вы делаете, нам нужно сначала узнать о HTTP.

Сначала основы: что такое HTTP?

Связь между браузером и сервером или наоборот происходит по протоколу HTTP. HTTP-сообщение состоит из заголовков и тела. Вот анатомия HTTP-запроса:

HTTP/<HTTP version> <HTTP code> <HTTP code description>
Some-Header: Some value
Some-Other-Header: Some other value
 
Some data.

Это так просто.

Вот (упрощенный) ответ HTTP, который наш браузер получает, когда мы посещаем мой замечательный веб-сайт:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
 
<!DOCTYPE html>
<html>
    <head>
        <title>My Awesome Website</title>
    </head>
    <body>
        <h1>Welcome to my awesome website!</h1>
    </body>
</html>

Да, вы смотрите на веб-страницу в ее самом сыром виде, ха-ха! 😅 Это то, что браузер получает, когда вы нажимаете любой URL.

Обратите внимание на первую строку. Вы можете прочитать 200 OK, что означает, что на веб-странице нет проблем и все работает отлично. Кодов много, и вы можете найти их в Википедии.

Что такое HTTP-сообщение для перенаправления?

Если вы попытаетесь перейти по URL-адресу https://www.benjamincrozat.com в своем веб-браузере, вы будете перенаправлены на https://benjamincrozat.com. Вот упрощенное HTTP-сообщение (я получил его с помощью HTTP-клиента):

HTTP/1.1 301 Moved Permanently
Content-Type: text/html
Location: https://benjamincrozat.com/
 
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

Как видите, это довольно просто. Ключевым заголовком здесь является «Местоположение», которое нам нужно для указания URL-адреса, на который мы хотим перенаправить. В теле HTML не обязателен, но если ваш HTTP-клиент или веб-браузер не следуют перенаправлениям (да, они могут игнорировать их при правильных настройках), вы, по крайней мере, будете знать, что происходит.

В следующем разделе мы увидим, как создать наше HTTP-сообщение с помощью PHP и какой HTTP-код нам нужно использовать.

Используйте PHP для перенаправления пользователей

Использовать PHP для добавления заголовков к ответу HTTP, который будет отправлен в браузер, очень просто. Вот шаги, которые нам необходимо предпринять:

  1. Отправить заголовок;
  2. Остановите выполнение кода с помощью функции exit() (иначе ваш пользователь будет перенаправлен после завершения выполнения кода);

Функцию добавления заголовков чертовски легко запомнить: header()

<?php
 
header('Location: https://example.com/some/page');
 
exit;
 
// This code will never be executed.
do_something();
 
 // Text output should come after headers.
 // This code won't be executed either.
echo 'Hello, World!';

В чем разница между редиректами 301 и 302?

По умолчанию добавление заголовка Местоположение приведет к переадресации 302 Moved Temporary. Но в большинстве случаев нам нужно перенаправление 301 Moved Permanently (наиболее распространенный вариант использования — для целей SEO). Начиная с PHP 5.4, мы можем использовать функцию http_response_code()ˋ:

<?php
 
http_response_code(301);
 
header('Location: https://example.com/some/page');

Кому или чему выгоден правильный HTTP-код?

  • Пользователи, использующие созданный вами веб-API. Им нужно знать, когда что-то пошло правильно или неправильно, и стандартный способ сделать это — использовать правильные HTTP-коды (200 OK, 404 Not Found, 500 Server Error и т. д.);
  • Бот Google пытается выяснить, что происходит на вашем сайте. Например, когда он видит HTTP-код «301 Moved Permanently», он знает, что ваша страница была перемещена в новое место и нуждается в обновлении в своем индексе.

Есть много других вариантов использования, которые я не буду здесь перечислять, но поверьте мне, когда я скажу вам, что это важно.