Как сделать перенаправление в PHP?

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

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

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


person Sam    schedule 20.04.2009    source источник
comment
Вы можете обновить заголовок в PHP: header   -  person Zack Marrapese    schedule 20.04.2009
comment
@Sam: так же, как и боковой узел, не реализуйте какие-либо protection from unauthorized users через перенаправление; это не то, как надо делать;)   -  person Strae    schedule 27.05.2011
comment
@Strae Что плохого в защите страниц с помощью перенаправления? Тогда как лучше всего?   -  person    schedule 16.08.2013
comment
Редирект @PravindaAmarathunga - один из элементов, но не единственный. Просто убедитесь, что защищенные элементы вообще не выводятся для неавторизованных пользователей; Перенаправление браузера можно отключить на стороне клиента, например: если браузер не выполняет перенаправление и исходная страница выводится как обычно, что увидит пользователь? CMS обычно выполняет перенаправление и не распечатывает защищенные элементы, заменяя нормальный вывод любезным сообщением.   -  person Strae    schedule 17.08.2013
comment
@PravindaAmarathunga проверьте ссылку из ответа Маркуса: thedailywtf.com/Articles/   -  person Strae    schedule 17.08.2013


Ответы (32)


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

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

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

header('Location: '.$newURL);

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

die () или exit ()

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

Почему вам следует использовать die() или exit(): The 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/");
person Community    schedule 20.04.2009
comment
Некоторые проблемы с этим ответом: 303 может быть неправильным кодом состояния. 301 может быть желательным, например, для Google. Во-вторых, header('Location: '.$newURL); должен быть перед передачей в браузер любого HTML (или текста), иначе он не будет работать правильно. - person Chuck Le Butt; 27.05.2011
comment
Кроме того, если новый URL-адрес создается путем объединения пользовательского ввода, следует провести некоторую дезинфекцию. :) - person MarioVilas; 27.04.2014
comment
К сожалению, ежедневная история WTF - обычное дело. В любом случае, проблема не в недостающем кристалле, а в плохой конструкции. Насильственное прекращение процесса является неправильным в 99,9% случаев. Распространенное, более чистое решение (в любом случае не мое любимое) - создать исключение RedirectionException и перехватить его в точке входа в приложение. После этого у вас могут быть все ваши последующие * звонки (журналы / закрытие соединений / что угодно) - person robertodecurnex; 17.07.2014
comment
http-equiv="Location" поддерживается не всеми браузерами. Вместо этого вы должны использовать refresh! <meta http-equiv="refresh" content="0;url=http://example.com/"> - person Timo002; 23.09.2014
comment
Никогда не выдавайте 301, если вы серьезно не об этом. 301 означает постоянный, а постоянный означает постоянный, то есть он будет кэшироваться пользовательскими агентами, что означает долгие ночи, наполненные кофеином, глядя в журналы приложений, задаваясь вопросом, сойдете ли вы с ума, потому что вы клянетесь, что какая-то страница должна иметь был вызван или обновлен, и вы клянетесь богом, что он работает на вашей машине, но не на клиентской. Если вам абсолютно необходимо вызвать 301, установите для ресурса максимальный возраст управления кешем. У вас нет безграничной мудрости, и вам не следует вести себя так, как вы. - person madumlao; 12.12.2014
comment
Но есть ли причина использовать умирание при выходе? Выход кажется более чистым и подходящим. - person ars265; 09.03.2015
comment
Примечание о PECL: PECL 2.x по какой-то причине не включает http_redirect, поэтому ставки на http_redirect могут быть ошибкой в ​​долгосрочной перспективе. - person Christopher Schultz; 19.05.2015
comment
комментатор @tgape в истории WTF говорит, что exit () следует использовать вместо die (): ‹< Если есть кубик сразу после перенаправления заголовка, код всегда попадет в него, и ваша ошибка журналы заполнятся бесполезными ошибками ›› - person Nick Humphrey; 22.05.2015
comment
Мне интересно, почему все эти коды работают нормально на моем локальном хосте, но не работают, когда система работает на хостинг-сайте .. хм .. - person rhavendc; 20.06.2016
comment
Решение 6 полезно, когда нужно отслеживать перенаправления с помощью скриптов отслеживания на стороне клиента, например. Гугл Аналитика. - person dpa; 18.11.2016
comment
+1 для информации Абсолютный URL - это приводило к тому, что мое перенаправление не выполнялось на Chrome (ну, на самом деле мне не хватало http: //, но это указывало мне в этом направлении). - person kris; 14.12.2016
comment
не забудьте добавить заголовок (Cache-Control: no-cache); перед линией - person Mahdi Jazini; 03.01.2017
comment
Я объединил решение заголовка и использовал команду die( "echo here" ) для вывода мета-тега обновления и всех допустимых js-решений, и у меня должен получиться довольно совместимый маленький перенаправитель! - person RozzA; 07.07.2017
comment
Я продолжаю читать, что отправка заголовка во время потоковой передачи html вызовет ошибку «Невозможно изменить заголовок», но я не видел этого некоторое время. У меня есть даже файлы cookie, принимаемые браузером после того, как в него начал работать html. Я просто установил код со 150 строками html, прерванными заголовком, отправленным php. Я не могу найти никаких уведомлений о проблеме ни в журнале ошибок php, ни в инспекторе Chrome. codepen.io/danallenhtn/pen/ooGWgd - person DanAllen; 16.11.2017
comment
@DanAllen у вас может быть включена буферизация вывода; поскольку он фактически не выводит данные клиенту во время выполнения кода, он обращается к вызову header() и закрепляет его перед сбросом буфера клиенту. - person Doktor J; 01.06.2018
comment
С июля 2014 года в заголовке Location разрешены относительные URL-адреса. См. Последнее обновление в ответе stackoverflow.com/a/25643550/1657819 (см. tools.ietf.org/html/rfc7231#section-7.1.2) - person The Godfather; 13.08.2018
comment
wtf ??? сканер может читать php код ??? Я думал, они читают html и js ... но если читает php, значит, что он внутри вашего сервера, это не сканер, который является вирусом, и вам нужно беспокоиться гораздо больше, чем о перенаправлении ... Я удивлен, что никто этого не замечает. .. - person Ari Waisberg; 15.08.2018
comment
Я согласен с @robertodecurnex. Проблема с The Daily WTF story в том, что он использует перенаправление, чтобы предотвратить удаление неавторизованным пользователем. Это абсолютно плохой дизайн. Никогда не следует полагаться на перенаправление, чтобы что-либо предотвратить. - person Ehsan88; 17.04.2019
comment
Если вы делаете это во фреймворке, то die() или exit(), вероятно, последнее, что вам следует делать. Проверьте, как вы должны аккуратно выйти из фреймворка, чтобы у него была возможность регистрировать вещи, очищать, закрывать файлы и т. Д. Конечно, фреймворк, вероятно, уже будет иметь вспомогательную функцию или метод для перенаправления, но я упоминаю об этом так как хорошо не иметь привычки просто делать exit(), не думая о последствиях в приложении. - person Jason; 10.05.2019
comment
есть ли способ перенаправить до того, как браузер обнаружит протокол HTTP? Причина, по которой мне нужно перенаправить, заключается в том, что я не могу получить достаточно сертификатов SSL для всех моих доменов. я бы использовал .htaccess для перенаправления, но мне нужен способ каким-то образом передать, какой домен перенаправлен на последний домен? - person oldboy; 07.08.2019

Используйте 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

Обязательное возобновление _7 _ / _ 8_ - это какая-то городская легенда, не имеющая ничего общего с настоящим PHP. Это не имеет ничего общего с тем, что клиент "уважает" заголовок Location:. Отправка заголовка не останавливает выполнение PHP, независимо от используемого клиента.

person vartec    schedule 20.04.2009
comment
die () или exit () предназначены для клиентов, которые не уважают заголовок Location: ... - person clawr; 21.04.2009
comment
@clawr: Нет, exit() предотвращает отображение остального содержимого на странице (подумайте о страницах с ограниченным доступом). vartec прав, он не имеет ничего общего с заголовком HTTP Location, и вам не нужно exit. Я решил включить его в свой ответ, потому что для того, кто не знает, как выполнить простое перенаправление, можно действовать осторожно, а не не реализовывать простой, но важный шаг, просто чтобы он возможность воспользоваться преимуществами расширенного управления процессом. - person Alix Axel; 05.06.2013
comment
Но браузеры, которые уважают заголовок, покинут страницу и закроют соединение, пока ваш скрипт все еще выполняется. Это совсем плохо. PHP будет продолжать выполнение сценария в течение некоторого времени (поэтому ваш код выполняется), но может прервать его случайным образом в середине выполнения, в результате чего все будет сломано. Вызов ignore_user_abort () предотвратит это, но, честно говоря, этого не стоит. Просто продолжайте писать HTML (хотя, вероятно, бесполезно), но не делайте того, что записывает на диск или в базу данных после заголовка ('Location:'); Если возможно, запишите на диск перед перенаправлением. [Также: URL-адрес должен быть абсолютным.] - person FrancescoMM; 21.03.2017
comment
есть ли способ перенаправить до того, как браузер обнаружит протокол HTTP? Причина, по которой мне нужно перенаправить, заключается в том, что я не могу получить достаточно сертификатов SSL для всех моих доменов. я бы использовал .htaccess для перенаправления, но мне нужен способ каким-то образом передать, какой домен перенаправлен на последний домен? - person oldboy; 07.08.2019

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 ()!

person Alix Axel    schedule 20.04.2009
comment
И не забывайте о буферизации вывода, иначе вы получите сообщение «Заголовки уже отправлены». - person Kuroki Kaze; 20.04.2009
comment
... и не забудьте распечатать somthign, как будто вы будете перенаправлены на $ nepage через $ n секунд, щелкните здесь ссылку $, если перенаправление не происходит. Некоторые брокеры и некоторые настройки браузера могут не выполнить перенаправление. - person Strae; 20.04.2009
comment
@DaNieL: этот тип перенаправления не займет $ n секунд. Это произойдет мгновенно, если это вообще произойдет, и любой соответствующий браузер должен с этим справиться. Я думаю, вы думаете о переадресации мета-обновления, которую люди используют, когда ничего не знают. - person rmeador; 20.04.2009
comment
@rmeador ... Для старых и специализированных браузеров. Сначала вы должны создать заголовок Location, если не удалось выполнить мета-перенаправление, вы будете перенаправлены на страницу через x секунд со ссылкой в ​​случае сбоя мета-перенаправления. Это правильный и надежный способ перенаправления. - person Andrew Moore; 21.04.2009
comment
Эндрю: как HTTP-браузер может не уважать Location :? - person vartec; 21.04.2009
comment
не включает статус 303. - person markus; 21.04.2009
comment
@Kuroki Kaze: Вы не получите сообщение «Заголовки уже отправлены» из-за проверки headers_sent (). - person Alix Axel; 13.08.2009
comment
@vartec Это не обязательно должен быть браузер, это может быть паук или злоумышленник. - person MarioVilas; 27.04.2014
comment
@MarioVilas, почему паук или злоумышленник - проблема? Если намерение состоит в том, чтобы увести посетителя от конфиденциальной части сайта, тогда дизайн приложения уже довольно ошибочен ... - person MauganRa; 13.11.2016
comment
зачем нам exit () или die ()? - person Tanner Summers; 20.11.2016
comment
@TannerSummers: поэтому обработка на PHP больше не выполняется, и пользователю не отображается контент. Первый потенциально опасен (удаление записей и т. Д.) И труден для отладки. - person MestreLion; 04.08.2018

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

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

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

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

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

person Hammad Khan    schedule 27.06.2014
comment
Простой и точный ответ! Отлично подходит для простого перенаправления страниц! - person Stathis Andronikos; 19.05.2016
comment
И таким образом вы не столкнетесь с обычной Cannot modify header information - headers already sent by ошибкой. - person Avatar; 28.08.2016
comment
@hmd, а что если отключен javascript? - person Istiaque Ahmed; 10.09.2017
comment
@IstiaqueAhmed javascript в наши дни почти всегда включен, но если он отключен, вы можете использовать буфер PHP. Этот вопрос SO отвечает на этот вопрос. Если вы используете буферизацию PHP, я полагаю, вам не нужен этот метод. - person Hammad Khan; 10.09.2017
comment
Неверно, вы можете (и должны) делать это в PHP даже без буферизации: на хорошо спроектированной странице вся соответствующая обработка PHP должна выполняться до того, как любое содержимое HTML будет отправлено пользователю. Таким образом, переадресация PHP будет работать нормально. - person MestreLion; 04.08.2018
comment
javascript не активируется автоматически, фактически это справедливо только для современных браузеров. также вопрос был о php, а не о JS - person clockw0rk; 04.06.2020
comment
Ага, это ответ на совершенно другой вопрос. У вас нет контроля над клиентской стороной, и опасно предполагать, что вы это делаете. - person miken32; 08.12.2020

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

здесь вы не столкнетесь с проблемой

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

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

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

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

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
?>
person Juned Ansari    schedule 13.04.2017
comment
Работайте как шарм. Я использую ‹? Php echo ‹script› location.href = 'google.fr /';‹ / script›; ? ›Чтобы протестировать его, и он сделал то, что я хотел - person DoctorDroid Haiti; 27.03.2019

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

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

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

person nickf    schedule 20.04.2009
comment
Как насчет того, чтобы дать пользователю какой-то вывод перед тем, как убить скрипт? Вы знаете, люди любят знать, что происходит ... - person Strae; 20.04.2009
comment
вы предполагаете, что скрипту нечего делать, кроме перенаправления. Что может быть совсем не так. - person vartec; 20.04.2009
comment
@DaNieL: поменяй его на смерть (перестань игнорировать мои заголовки!) - person nickf; 21.04.2009
comment
Мне понравилось это простое объяснение die();, которое вы дали - если вы этого не сделаете, пользователь может на мгновение увидеть всю страницу, если вы ее используете; пользователь будет перенаправлен, и временный сбой контента не будет отображаться + 1 - person TheBlackBenzKid; 02.06.2015
comment
После отправки заголовка возможна полезная активность, которая ничего не отправляет в браузер, но регистрирует активность или завершает запись транзакций. По этой причине необходимость в die / exit зависит от сценария. - person DanAllen; 16.11.2017
comment
Для протокола, эта статья - ерунда. Проблема заключалась в конструкции, которая использовала запросы GET для внесения изменений на сервер, что является ОГРОМНЫМ запретом. - person miken32; 08.12.2020

Использовать:

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

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

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

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

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

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

person jake    schedule 16.05.2016
comment
он работает только как первый оператор в коде. Если у вас есть логика и перенаправление основано на этом. используйте мета-обновление http-Equiv или window.open javascript, чем. (скопировано) - person MindRoasterMir; 20.03.2021
comment
Это не обязательно должен быть первый оператор в коде. Это просто необходимо перед любым выходом. Организуйте свой код так, чтобы он выполнял всю логику до того, как он начнет печатать вывод - тогда, вероятно, он должен распечатать подготовленный вывод за один раз. - person bdsl; 30.05.2021

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

<?php
    session_start();

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

    // Page goes here
?>

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

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

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

person Asuquo12    schedule 09.09.2016

Многие из этих ответов верны, но они предполагают, что у вас есть абсолютный 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
person Luke    schedule 15.01.2014

Используйте следующий код:

header("Location: /index.php");
exit(0);   
person joan16v    schedule 12.01.2015

Я уже ответил на этот вопрос, но сделаю это еще раз, так как за это время я узнал, что есть особые случаи, если вы работаете в 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)
person Alix Axel    schedule 28.04.2011

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

<?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();
?>
person Star    schedule 13.02.2018
comment
Почему (ближе к концу второго абзаца)? Вы имеете в виду &para вместо этого (чтобы все читалось как mypage.php?param1=val1&param2=val2))? (HTML-сущность para) - это ¶ - возможно, какая-то внешняя программа выполнила преобразование?) . - person Peter Mortensen; 18.02.2019

Использовать:

<?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.
?>
person Obaidul Haque    schedule 18.08.2017

Да, можно использовать PHP. Мы перенаправим на другую страницу.

Попробуйте следующий код:

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>
person Bhargav Chudasama    schedule 08.06.2017

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

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

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

person Henrik Paul    schedule 20.04.2009

Вы можете использовать некоторые методы 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");

person Vikram Pote    schedule 12.03.2015
comment
Javascript работает на клиенте, который может быть, а может и не быть тем, что вы ищете. - person chharvey; 07.08.2015

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

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

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

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

person Casper    schedule 28.11.2017

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

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

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

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

person Brent    schedule 20.04.2009
comment
but you need to do it before you've sent any other output to the browser. Замечательно !! Я искал минуты, почему я продолжал получать уже отправленные заголовки с ошибкой. +1 !! - person josh; 18.01.2014
comment
В общем, у вас есть / полностью остановить скрипт /. die() - лишь один из способов сделать это. - person MauganRa; 13.11.2016

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

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

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

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

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

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

person Bhaskar Pramanik    schedule 28.01.2017
comment
exit () следует использовать сразу после header () - person EKanadily; 17.02.2017
comment
@docesam .. согласен .. exit () должен вызываться сразу после вызова header (). Однако я чувствую, что если после этого оператора header () больше нет вывода в браузер, exit () может не понадобиться - просто мое мнение - person Bhaskar Pramanik; 20.02.2017
comment
да, но вы должны объяснить это, потому что кто-то может скопировать вашу строку кода в свой сценарий, и это потенциально может привести к тому, что он долго будет кружиться вокруг себя, выясняя, что пошло не так. - person EKanadily; 21.02.2017
comment
@BhaskarPramanik представьте, что вам нужно быстро запереть дверь, но затем вам нужно снова потянуть / толкнуть / разбить ее, чтобы убедиться, заперта она уже или нет .. - person aswzen; 22.03.2018

Лучший способ перенаправления с помощью PHP - это следующий код ...

 header("Location: /index.php");

Убедитесь, что ни один код не будет работать после

header("Location: /index.php");

Весь код должен быть выполнен до указанной выше строки.

Предполагать,

Случай 1:

echo "I am a web developer";
header("Location: /index.php");

Он будет правильно перенаправлен в местоположение (index.php).

Случай 2:

return $something;
header("Location: /index.php");

Приведенный выше код не будет перенаправлять в местоположение (index.php).

person sabuz    schedule 09.04.2017
comment
Уже есть ответ с 1085, который содержит предоставленную вами информацию и многое другое. - person Patrick Hund; 09.04.2017

1. Использование header, встроенной функции PHP

а) Простое перенаправление без параметров

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

б) Перенаправление с параметрами GET

<?php
      $id = 2;
      header("Location: index.php?id=$id&msg=succesfully redirect");
  ?>

2. Перенаправление с помощью JavaScript в PHP

а) Простое перенаправление без параметров

<?php
     echo "<script>location.href='index.php';</script>";
 ?>

б) Перенаправление с параметрами GET

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>
person Shaan Ansari    schedule 03.08.2018
comment
Бит javascript каким-то образом был единственным, что работало на финальном хостинге сайта; Я считаю, что это вопрос кеширования, но с этим я сразу решил это. - person cdsaenz; 28.04.2020


Использование функции заголовка для маршрутизации

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

Предположим, мы хотим выполнить маршрутизацию из файла A.php в B.php, чем нам потребуется помощь <button> или <a>. Давайте посмотрим на пример

<?php
if(isset($_GET['go_to_page_b'])) {
    header('Location: B.php');
    exit();

}
?>

<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>

B.php

<p> I am Page B</p>
person Mehedi Abdullah    schedule 15.03.2020
comment
Решения уже есть. В вашем решении смешаны HTML и PHP без тегов PHP. Во-вторых, вы отправляете заголовок после печати html-кода, поэтому он не будет работать. И названия файлов примеров плохие. Вы не должны называть их A.php и B.php. Я знаю, что это всего лишь пример, но все же вы должны позаботиться о соглашении об именах. - person Jsowa; 07.05.2020

Для перенаправления в php используйте:

<?php header('Location: URL'); exit; ?>

person Kevin M. Mansour    schedule 07.01.2021

Использовать:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>
person Joshua Charles Pickwell    schedule 20.11.2017
comment
Не могли бы вы объяснить функцию вашего кода? Ваш ответ был помечен из-за его длины и содержания. - person www139; 20.11.2017

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

В основном

$your_target_url = “www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

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

Давайте попробуем, проверив уровень пользователя.

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

В function.php

<?php
    function authRedirect($get_auth_level,
                          $required_level,
                          $if_fail_link = “www.example.com/index.php”){
        if ($get_auth_level != $required_level){
            header(location : $if_fail_link);
            return false;
            exit();
        }
        else{
            return true;
        }
     }

     . . .

Затем вы вызовете функцию для каждой страницы, которую хотите аутентифицировать.

Как в page.php или любой другой странице.

<?php

    // page.php

    require “function.php”

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);

    . . .

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

person Pyr James    schedule 28.01.2018

Мне нравится переадресация после отсчета секунд

<?php

header("Refresh: 3;url=https://theweek.com.br/índex.php");
person Paulo Boaventura    schedule 13.01.2020

Вы можете попробовать использовать

заголовок ("Местоположение:". $ your_url)

для получения дополнительной информации обратитесь к официальной документации php

person Nimal V    schedule 14.06.2021

Если вы работаете на Apache, вы также можете использовать .htaccess для перенаправления.

Redirect 301 / http://new-site.com/
person michal.jakubeczy    schedule 13.10.2017

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

ob_start();
header("Location: " . $website);
ob_end_flush();
person Doruk Ayar    schedule 15.11.2016
comment
exit () следует использовать сразу после header (). также буферизация вывода автоматически включена по умолчанию в течение некоторого времени. - person EKanadily; 17.02.2017

Попробуй это

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
person Shareque    schedule 09.01.2020
comment
какой код в .htaccess ??? - person Paulo Boaventura; 28.05.2021

person    schedule
comment
есть ли способ перенаправить до того, как браузер обнаружит протокол HTTP? Причина, по которой мне нужно перенаправить, заключается в том, что я не могу получить достаточно сертификатов SSL для всех моих доменов. я бы использовал .htaccess для перенаправления, но мне нужен способ каким-то образом передать, какой домен перенаправлен на последний домен? - person oldboy; 07.08.2019