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

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

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

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

Ответы [ 31 ]

13 голосов
/ 29 апреля 2011

Я уже ответил на этот вопрос, но я сделаю это снова, поскольку тем временем я узнал, что есть особые случаи, если вы работаете в CLI (перенаправления не могут произойти и, следовательно, не должны exit() ) или если ваш веб-сервер использует PHP как (F) CGI (для правильного перенаправления требуется предварительно установленный заголовок Status).

function Redirect($url, $code = 302)
{
    if (strncmp('cli', PHP_SAPI, 3) !== 0)
    {
        if (headers_sent() !== true)
        {
            if (strlen(session_id()) > 0) // If using sessions
            {
                session_regenerate_id(true); // Avoids session fixation attacks
                session_write_close(); // Avoids having sessions lock other requests
            }

            if (strncmp('cgi', PHP_SAPI, 3) === 0)
            {
                header(sprintf('Status: %03u', $code), true, $code);
            }

            header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
        }

        exit();
    }
}

Я также занимался вопросом поддержки различных кодов перенаправления HTTP (301, 302, 303 и 307), как было решено в комментариях к моему предыдущему ответу. Вот описания:

  • 301 - Перемещение окончательно
  • 302 - найдено
  • 303 - см. Другие
  • 307 - Временное перенаправление (HTTP / 1.1)
10 голосов
/ 12 января 2015
header("Location: /index.php");
exit(0);   
8 голосов
/ 12 марта 2015

Вы можете использовать некоторые методы JavaScript, как показано ниже

  1. self.location="http://www.example.com/index.php";

  2. window.location.href="http://www.example.com/index.php";

  3. document.location.href = 'http://www.example.com/index.php';

  4. window.location.replace("http://www.example.com/index.php");

7 голосов
/ 28 ноября 2017

Да, вы можете использовать функцию header () ,

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();

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

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

7 голосов
/ 13 февраля 2018

Чтобы перенаправить посетителя на другую страницу (особенно полезно в условном цикле), просто используйте следующий код:

<?php
    header('Location: mypage.php');
?>

В этом случае mypage.php - это адрес страницы, на которую вы хотите перенаправить посетителей. Этот адрес может быть абсолютным и может также включать параметры в этом формате: mypage.php?param1=val1&m2=val2)

Относительный / Абсолютный Путь

При работе с относительными или абсолютными путями идеально выбирать абсолютный путь от корня сервера (DOCUMENT_ROOT). Используйте следующий формат:

<?php
    header('Location: /directory/mypage.php');
?>

Если целевая страница находится на другом сервере, укажите полный URL-адрес:

<?php
    header('Location: http://www.ccm.net/forum/');
?>

Заголовки HTTP

Согласно протоколу HTTP, заголовки HTTP должны отправляться before любым типом контента. Это означает, что никакие символы никогда не должны отправляться перед заголовком - даже пустой пробел!

Временные / постоянные перенаправления

По умолчанию представленный выше тип перенаправления является временным. Это означает, что поисковые системы, такие как Google Search, не будут учитывать перенаправление при индексации.

Если вы хотите уведомить поисковые системы о том, что страница была окончательно перемещена в другое место, используйте следующий код:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: new_address');
?>

Например, эта страница имеет следующий код:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: /pc/imprimante.php3');
    exit();
?>

Когда вы нажимаете на ссылку выше, вы автоматически перенаправляетесь на эту страницу. Более того, это постоянное перенаправление (статус: 301 перемещен навсегда). Поэтому, если вы введете первый URL-адрес в Google, вы будете автоматически перенаправлены на вторую перенаправленную ссылку.

Интерпретация PHP-кода

Код PHP, расположенный после header (), будет интерпретироваться сервером, даже если посетитель перейдет по адресу, указанному в перенаправлении. В большинстве случаев это означает, что вам нужен метод следования функции header() функции exit(), чтобы уменьшить нагрузку на сервер:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
7 голосов
/ 11 апреля 2019

вы можете использовать этот код перенаправления с одной страницы на другую

header("Location: index.php");

или если вы попытаетесь перенаправить с помощью JavaScript в php, используйте скрипт script для перенаправления

echo "<script>window.open('your path where you redirect ','_self')</script>";
7 голосов
/ 18 августа 2017

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

<?php
    header('Location: redirectpage.php');
    header('Location: redirectpage.php');
    exit();
    echo "<script>location.href='redirectpage.php';</script>";
?>

Это обычное и нормальное перенаправление PHP, но вы можете сделать страницу перенаправления за несколько секунд, используя следующий код:

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>
6 голосов
/ 21 апреля 2009

В канун семантической паутины правильность - это то, что нужно учитывать. К сожалению, PHP-заголовок "Location" по-прежнему использует HTTP 302 -обращенный код, который, строго говоря, не самый лучший для перенаправления. Вместо этого он должен использовать 303 .

W3C достаточно любезен, чтобы упомянуть , что заголовок 303 несовместим со "многими пользовательскими агентами до HTTP / 1.1", что в настоящее время не означает отсутствие браузера. Итак, 302 - это реликвия, которую не следует использовать .

... или вы можете просто проигнорировать это, как и все остальные ...

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

Как и другие здесь сказали, отправив заголовок местоположения с:

header( "Location: http://www.mywebsite.com/otherpage.php" );

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

Кроме того, если вы собираетесь использовать это для блокировки неаутентифицированных пользователей с определенных страниц, как вы упомянули, имейте в виду, что некоторые пользовательские агенты проигнорируют это и продолжат работу на текущей странице , так что вам нужно умереть () после отправки.

6 голосов
/ 28 января 2017

Вот мои мысли:

ИМХО, лучший способ перенаправить входящий запрос - использовать заголовки местоположения, которые идут

<?php
    header("Location: /index.php");
?>

Как только этот оператор будет выполнен и выходные данные отправлены, браузер начнет перенаправлять пользователя. Однако убедитесь, что перед отправкой заголовков не было никакого вывода (никакого echo / var_dump), иначе это приведет к ошибкам.

Несмотря на то, что это быстрый и грязный способ достичь того, о чем изначально просили, в конечном итоге это окажется катастрофой для SEO, поскольку такой вид перенаправления всегда интерпретируется как редирект 301/302, следовательно, поисковые системы всегда рассматривайте свою индексную страницу как перенаправленную страницу, а не как целевую страницу / главную страницу.

Следовательно, это повлияет на настройки SEO сайта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...