Как перехватить редирект и узнать как он сделан?

В PHP для перехвата редиректа и определения способа его выполнения можно использовать различные подходы и функции.

1. Использование функции curl_getinfo():
Для этого необходимо использовать библиотеку cURL. Функция curl_getinfo() позволяет получить информацию о запросе, включая URL-адрес и код состояния (статус) ответа. В случае перенаправления, возвращается информация о последнем перенаправлении.
Пример кода:

   $ch = curl_init($url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_exec($ch);
   
   $redirectUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
   $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
   
   curl_close($ch);
   
   echo "Перенаправление произошло на URL: " . $redirectUrl;
   echo "Код состояния: " . $httpCode;

2. Использование функции get_headers():
Данная функция позволяет получить заголовки ответа сервера, включая информацию о перенаправлениях. Если указан дополнительный аргумент true, то функция вернет массив с заголовками. Мы можем использовать полученный массив для определения способа и URL-адреса перенаправления.
Пример кода:

   $headers = get_headers($url, 1);
   
   if (isset($headers['Location'])) {
       $redirectUrl = $headers['Location'];
       if (is_array($redirectUrl)) {
           $redirectUrl = end($redirectUrl);
       }
       
       echo "Перенаправление произошло на URL: " . $redirectUrl;
   }

3. Использование функции header():
Если вы хотите перехватить редирект на сервере, вы можете использовать функцию header(). Она позволяет отправить заголовки ответа серверу. Если на сервере установлено перенаправление с помощью этой функции, то вы можете получить URL-адрес перенаправления.
Пример кода:

   ob_start();
   header("Location: " . $url, true, 301);
   ob_get_clean();
   
   $redirectUrl = $_SERVER['HTTP_REFERER'];
   
   echo "Перенаправление произошло на URL: " . $redirectUrl;

При использовании любого из этих подходов, вы сможете перехватить редирект и узнать URL-адрес перенаправления. Дополнительно, можно также получить код состояния (статус) ответа, который указывает на успешность перенаправления.