Как мне сделать редирект в PHP? - PullRequest
1143 голосов
/ 20 апреля 2009

Можно ли перенаправить пользователя на другую страницу с помощью PHP?

Скажите, что пользователь переходит на www.example.com/page.php, и я хочу перенаправить его на www.example.com/index.php, как бы я сделал это без использования метаобновления? Возможно ли это?

Это может даже защитить мои страницы от неавторизованных пользователей.

Ответы [ 31 ]

1581 голосов
/ 20 апреля 2009

Сводка существующих ответов плюс два моих собственных цента:

1. Основной ответ

Вы можете использовать функцию header() для отправки нового HTTP-заголовка, но его необходимо отправить в браузер перед любым HTML или текстом (например, перед объявлением <!DOCTYPE ...>).

header('Location: '.$newURL);

2. Важные детали

die () или exit ()

header("Location: http://example.com/myOtherPage.php");
die();

Почему вы должны использовать die() или exit(): Daily WTF

Абсолютный или относительный URL

С июня 2014 года можно использовать как абсолютные, так и относительные URL. См. RFC 7231 , который заменил старый RFC 2616 , где разрешены только абсолютные URL.

Коды состояния

Заголовок PHP "Location" все еще использует прямой код HTTP 302 , но это не тот, который вы должны использовать. Вам следует рассмотреть либо 301 (постоянное перенаправление), либо 303 (другое).

Примечание: W3C упоминает , что заголовок 303 несовместим со "многими пользовательскими агентами до HTTP / 1.1. Все используемые в настоящее время браузеры являются пользовательскими агентами HTTP / 1.1. Это не так для многих других пользователей агенты, такие как пауки и роботы.

3. Документация

Заголовки HTTP и функция header() в PHP

4. Альтернативы

Вы можете использовать альтернативный метод http_redirect($url);, для которого требуется установить пакет PECL pecl .

5. Вспомогательные функции

Эта функция не включает код состояния 303:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

Это более гибко:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. Обход

Как уже упоминалось, header() перенаправляет только работу, прежде чем что-либо записать. Обычно они терпят неудачу, если вызывается в середине HTML вывода. Тогда вы можете использовать обходной путь HTML-заголовка (не очень профессиональный!), Например:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

Или даже редирект JavaScript.

window.location.replace("http://example.com/");
103 голосов
/ 20 апреля 2009

Используйте функцию header() для отправки HTTP Location заголовка :

header('Location: '.$newURL);

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

Файл example.php :

<?php
    header('Location: static.html');
    $fh = fopen('/tmp/track.txt', 'a');
    fwrite($fh, $_SERVER['REMOTE_ADDR'] . ' ' . date('c') . "\n");
    fclose($fh);
?>

Результат трех казней:

bart@hal9k:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

Возобновление & mdash; обязательный die() / exit() - это городская легенда, которая не имеет ничего общего с настоящим PHP. Это не имеет ничего общего с клиентом, "уважающим" заголовок Location:. Отправка заголовка не останавливает выполнение PHP независимо от используемого клиента.

102 голосов
/ 20 апреля 2009
function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

Не забудьте умереть () / exit ()!

93 голосов
/ 27 июня 2014

Вывод JavaScript из PHP с помощью echo, который сделает эту работу.

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

На самом деле вы не можете сделать это в PHP, если не буферизуете вывод страницы, а потом проверяете состояние перенаправления. Это может быть слишком хлопотно. Помните, что заголовки - это первое, что отправляется со страницы. Большая часть перенаправления обычно требуется позже на странице. Для этого вы должны буферизовать весь вывод страницы и позже проверить состояние перенаправления. В этот момент вы можете либо перенаправить заголовок страницы пользователя (), либо просто отобразить буферизованный вывод.

Подробнее о буферизации (преимущества)

Что такое буферизация вывода?

81 голосов
/ 13 апреля 2017

1. Использование функции заголовка с exit()

<?php 
     header('Location: target-page.php');
     exit();
?>

но если вы используете функцию заголовка, иногда вы получите предупреждение " например, заголовок уже отправляет " для разрешения, которое не выводится и не печатается до отправки заголовков, или вы можете просто использовать die() или exit() после функции заголовка.

2. Без заголовка

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>

здесь не возникнет никаких проблем

3. Использование функции заголовка с ob_start() и ob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>
52 голосов
/ 20 апреля 2009

Большинство из этих ответов забывают очень важный шаг!

header("Location: myOtherPage.php");
die();

Если вы выйдете из этой жизненно важной второй строки, вы можете получить Daily WTF . Проблема заключается в том, что браузеры не имеют для соблюдения заголовков, которые возвращает ваша страница, поэтому при игнорировании заголовков остальная часть страницы будет выполняться без перенаправления.

23 голосов
/ 16 мая 2016

Использование:

<?php header('Location: another-php-file.php'); exit(); ?>

Или, если вы уже открыли теги PHP, используйте это:

header('Location: another-php-file.php'); exit();

Вы также можете перенаправить на внешние страницы, например ::100100

header('Location: https://www.google.com'); exit();

Убедитесь, что вы включили exit() или include die().

18 голосов
/ 09 сентября 2016

Вы можете использовать переменные сеанса для управления доступом к страницам и авторизации действительных пользователей:

<?php
    session_start();

    if (!isset( $_SESSION["valid_user"]))
    {
        header("location:../");
        exit();
    }

    // Page goes here
?>

http://php.net/manual/en/reserved.variables.session.php.

Недавно я получил кибератаки и решил, что мне нужно знать пользователей, пытающихся получить доступ к панели администратора или зарезервированной части веб-приложения.

Итак, я добавил доступ к журналу для IP-адреса и пользовательских сессий в текстовом файле, потому что я не хочу беспокоить мою базу данных.

18 голосов
/ 15 января 2014

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

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302
13 голосов
/ 20 апреля 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...