Как мне сделать редирект в PHP?
Можно ли перенаправить пользователя на другую страницу с помощью PHP?
Скажем, пользователь идет в www.example.com/page.php
и я хочу перенаправить их www.example.com/index.php
Как бы я сделать это без использования мета-обновления? Является ли это возможным?
Это может даже защитить мои страницы от посторонних пользователей.
40 ответов
Резюме существующих ответов плюс два моих собственных цента:
1. Основной ответ
Вы можете использовать header()
функция для отправки нового заголовка HTTP, но это должно быть отправлено в браузер перед любым HTML или текстом (так до <!DOCTYPE ...>
декларация, например).
header('Location: '.$newURL);
2. Важные детали
умереть () или выйти ()
header("Location: http://example.com/myOtherPage.php");
die();
Почему вы должны использовать die()
или же exit()
: Ежедневный WTF
Абсолютный или относительный URL
С июня 2014 года можно использовать как абсолютные, так и относительные URL. См. RFC 7231, который заменил старый RFC 2616, где допускались только абсолютные URL.
Коды состояния
Заголовок PHP "Location" все еще использует код HTTP 302- direct, но это не тот, который вы должны использовать. Вы должны рассмотреть либо 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/");
Использовать 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
Возобновление - обязательно die()
/ exit()
это городская легенда, которая не имеет ничего общего с реальным PHP. Это не имеет ничего общего с клиентом, "уважающим" Location:
заголовок. Отправка заголовка не останавливает выполнение PHP независимо от используемого клиента.
function Redirect($url, $permanent = false)
{
if (headers_sent() === false)
{
header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
}
exit();
}
Redirect('http://www.google.com/', false);
Не забудьте умереть ()/ выход ()!
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
?>
Вывод JavaScript из PHP с помощью echo, который сделает эту работу.
echo '<script type="text/javascript">
window.location = "http://www.google.com/"
</script>';
Вы не можете сделать это в PHP, если вы не буферизируете вывод страницы, а затем не проверяете состояние перенаправления. Это может быть слишком много хлопот. Помните, что заголовки - это первое, что отправляется со страницы. Большая часть перенаправления обычно требуется позже на странице. Для этого вы должны буферизовать весь вывод страницы и позже проверить состояние перенаправления. В этот момент вы можете либо перенаправить страницу заголовка пользователя (), либо просто отобразить буферизованный вывод.
Подробнее о буферизации (преимущества)
Большинство из этих ответов забывают очень важный шаг!
header("Location: myOtherPage.php");
die();
Выход из этой жизненно важной второй линии может привести к тому, что вы попадете на The Daily WTF. Проблема заключается в том, что браузеры не должны учитывать заголовки, которые возвращает ваша страница, поэтому, если заголовки игнорируются, остальная часть страницы будет выполняться без перенаправления.
<?php header('Location: another-php-file.php'); exit(); ?>
или, если вы уже открыли теги php, используйте это:
header('Location: another-php-file.php'); exit();
Вы также можете перенаправить на внешние страницы, например:
header('Location: https://www.google.com'); exit();
Убедитесь, что вы включили exit()
или же include die()
Вы можете использовать переменные сеанса для управления доступом к страницам и авторизации действительных пользователей.
<?php
session_start();
if ( !isset( $_SESSION["valid_user"]) )
{
header("location:../");
die();
}
// Page goes here
?>
http://php.net/manual/en/reserved.variables.session.php.
Недавно я получил кибератаки и решил, что мне нужно знать пользователей, пытающихся получить доступ к панели администратора или зарезервированной части веб-приложения.
Итак, я добавил IP доступа к журналу и сессии пользователя в текстовом файле, потому что я не хочу беспокоить мою базу данных.
Многие из этих ответов верны, но они предполагают, что у вас есть абсолютный 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
header( 'Location: http://www.yoursite.com/new_page.html' );
Я уже ответил на этот вопрос, но я сделаю это снова, так как тем временем я узнал, что есть особые случаи, если вы работаете в 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)
Чтобы перенаправить посетителя на другую страницу (особенно полезно в условном цикле), просто используйте следующий код:
<?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, не будут учитывать перенаправление при индексации.
Если вы хотите уведомить поисковые системы о том, что страница была постоянно перемещена в другое место, используйте следующий код:
<?
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();
?>
Для перенаправления в php используйте:
<?php header('Location: URL'); exit; ?>
header("Location: https://www.example.com/redirect.php");
Прямой редирект на эту ссылку https://www.example.com/redirect.php
$redirect = "https://www.example.com/redirect.php";
header("Location: $redirect");
Сначала получите значение $redirect , а затем перенаправьте на [value], например: https://www.example.com/redirect.php
<?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.
?>
Да, можно использовать PHP, мы перенаправим на другую страницу, попробуйте эту:
<?php
header("location:./");//redirect to index file
header("location:index.php");//redirect to index file
header("location:example.php");
?>
Накануне семантической паутины правильность - кое-что, чтобы рассмотреть. К сожалению, PHP-заголовок "Location" все еще использует код HTTP 302- directirect, который, строго говоря, не самый лучший для перенаправления. Вместо этого он должен использовать 303.
W3C достаточно любезен, чтобы упомянуть, что заголовок 303 несовместим со "многими пользовательскими агентами до HTTP/1.1", что в настоящее время не означает отсутствие браузера. Итак, 302 - это реликвия, которая не должна использоваться.
... или вы можете просто проигнорировать это, как и все остальные...
Вы можете использовать некоторые методы сценария Java, как показано ниже
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");
Да, вы можете использовать функцию header(),
header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();
А также рекомендуется вызывать функцию exit() сразу после header()
функция, чтобы избежать выполнения кода ниже.
Согласно документации, header()
должен быть вызван перед отправкой любого фактического вывода.
Вы можете использовать этот код перенаправить с одной страницы на другую
header("Location: index.php");
или если вы пытаетесь перенаправить с помощью JavaScript в php, то используйте тег script для перенаправления
echo "<script>window.open('your path where you redirect ','_self')</script>";
Наверное, слишком поздно, чтобы ответить на этот. Тем не менее, вот мои мысли:
ИМХО, лучший способ перенаправить входящий запрос - использовать заголовки местоположения
<?php
header("Location: /index.php");
?>
После того, как этот оператор выполнен и выходные данные отправлены, браузер начнет перенаправлять пользователя. Однако убедитесь, что перед отправкой заголовков не было никакого вывода (никакого echo / var_dump), иначе это приведет к ошибкам.
Хотя это быстрый и грязный способ достичь того, о чем первоначально просили, тем не менее, в конечном итоге это станет катастрофой для SEO, так как этот вид перенаправления всегда интерпретируется как переадресация 301 / 302, поэтому поисковые системы будут всегда рассматривайте свою индексную страницу как перенаправленную страницу, а не как целевую страницу / главную страницу. Следовательно, это повлияет на настройки SEO сайта.
Как и другие здесь сказали, отправив заголовок местоположения с:
header( "Location: http://www.mywebsite.com/otherpage.php" );
но вам нужно сделать это до того, как вы отправите любой другой вывод в браузер.
Кроме того, если вы собираетесь использовать это для блокировки неаутентифицированных пользователей с определенных страниц, как вы упомянули, имейте в виду, что некоторые пользовательские агенты проигнорируют это и все равно продолжат работу на текущей странице, поэтому вам придется умереть () после отправки.
Вы можете попробовать использовать
заголовок ("Местоположение:". $ your_url)
для получения дополнительной информации вы можете обратиться к официальной документации php
Лучший способ перенаправить с помощью 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).
Надеюсь, это понятно.
Вы можете использовать функцию header() в PHP для выполнения перенаправления на другую страницу. Функция header() отправляет в браузер необработанный HTTP-заголовок, который можно использовать для перенаправления пользователя на новую страницу. Вот пример:
<?php
// Redirect to a new page
header("Location: https://www.example.com/newpage.php");
exit;
?>
В этом примере функция header() отправляет заголовок «Местоположение» с URL-адресом новой страницы, на которую будет перенаправлен пользователь. Оператор выхода используется для немедленного завершения текущего выполнения сценария и предотвращения дальнейшего вывода.
Мы можем сделать двумя способами
- когда пользователь заходит на https://bskud.com/PINCODE/BIHAR/index.php затем перенаправляет на https://bskud.com/PINCODE/BIHAR.php
по нижеуказанному php-коду
<?php header("Location: https://bskud.com/PINCODE/BIHAR.php"); exit; ?>
Сохраните код выше в https://bskud.com/PINCODE/BIHAR/index.php
2. При выполнении любого условия переадресация на другую страницу
<?php $myVar = "bskud"; if ($myVar == "bskud") { ?> <script> window.location.href="https://bskud.com"; </script> <?php } else { echo "<b>Check Website Name Again</b>"; } ?>
`
Использование функции заголовка для маршрутизации
<?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>
Для перенаправления используйте этот код
header("Location: http://www.example.com/blog");
1. Использование заголовочной встроенной функции 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>";
?>