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

1048

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

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

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

  • 0
    Вы можете обновить заголовок в PHP: header
  • 10
    @Sam: так же, как побочный узел, не реализуйте никакой protection from unauthorized users посредством перенаправления; это не так, как надо делать;)
Показать ещё 3 комментария
Теги:
redirect

28 ответов

1416

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

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 "Местоположение" -header по-прежнему использует код HTTP 302 -redirect, но это не тот, который вы должны использовать. Вы должны рассмотреть либо 301 (постоянная переадресация), либо 303 (другое).

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

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

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

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

Вы можете использовать альтернативный метод http_redirect($url); который требует установки пакета 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() перенаправляет работу только до того, как все будет выписано. Обычно они выходят из строя, если вызывается inmidst вывод HTML. Тогда вы можете использовать обход HTML-заголовка (не очень профессиональный!), Например:

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

Или переопределить JavaScript.

window.location.replace("http://example.com/");
  • 5
    Некоторые проблемы с этим ответом: 303 не может быть «правильным» кодом состояния. 301 может быть желательным для Google, например. Во-вторых, header('Location: '.$newURL); должно быть перед передачей любого HTML (или текста) в браузер, иначе он не будет работать правильно.
  • 1
    Кроме того, если новый URL-адрес создается путем объединения пользовательского ввода, необходимо выполнить некоторую очистку. :)
Показать ещё 15 комментариев
98
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()!

  • 6
    И не забывайте буферизацию вывода, иначе вы получите «Заголовки уже отправлены».
  • 8
    ... и не забудьте распечатать somthign вроде «вы будете перенаправлены на $ nepage через $ n секунд, нажмите здесь ссылку $, если перенаправление не произойдет». Некоторые более широкие и некоторые настройки браузера могут потерпеть неудачу при перенаправлении.
Показать ещё 10 комментариев
87

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

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

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

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

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

  • 2
    Простой и точный ответ! Отлично подходит для простого перенаправления страниц!
  • 0
    И таким образом вы не столкнетесь с общей Cannot modify header information - headers already sent by ошибке.
Показать ещё 3 комментария
84

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

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);
?>

Результат или 3 исполнения:

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, независимо от используемого клиента.

  • 6
    die () или exit () предназначены для клиентов, которые не уважают заголовок «Location: ...»
  • 8
    @clawr: Нет, exit() запрещает странице отображать оставшееся содержимое (например, страницы с ограниченным доступом). vartec прав, он не имеет ничего общего с заголовком HTTP Location, и вам не нужно exit . Я решил включить его в свой ответ, потому что для тех, кто не знает, как сделать простое перенаправление, можно с осторожностью играть в безопасности, а не реализовывать простой, но важный шаг, чтобы он мог воспользоваться преимуществами продвинутого процесса. контроль.
Показать ещё 1 комментарий
60

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
?>
  • 0
    Работай как шарм. Я использую <? Php echo "<script> location.href = ' google.fr /';</script>"; ?> Чтобы проверить это, и он сделал то, что хотел
49

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

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

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

  • 1
    Как насчет того, чтобы дать какой-то вывод пользователю перед тем, как убить скрипт? Вы знаете, люди любят знать, что происходит в ...
  • 3
    вы предполагаете, что скрипт не имеет ничего общего, кроме перенаправления. Что может быть совсем не так.
Показать ещё 3 комментария
24
<?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()

18

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

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

<?php

session_start();

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

// Page goes here
?>

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

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

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

13

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

header( 'Location: http://www.yoursite.com/new_page.html' );

10
header("Location: /index.php");
exit(0);   
8

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

 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");
  • 0
    Javascript работает на клиенте, который может или не может быть то, что вы ищете.
7

Да, вы можете использовать header(),

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

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

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

7
<?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

Возможно, слишком поздно ответить на этот вопрос. Тем не менее, вот мои мысли:

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

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

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

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

  • 1
    exit () должен использоваться сразу после header ()
  • 0
    @docesam .. согласовано .. exit () должен быть вызван сразу после вызова header (). Однако я чувствую, что если после этого оператора header () больше нет вывода в браузер, exit () может и не понадобиться - просто мое мнение
Показать ещё 2 комментария
6

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

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

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

6

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

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

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

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

  • 0
    but you need to do it before you've sent any other output to the browser. Потрясающие!! Я искал минуты о том, почему я продолжал получать заголовки уже отправленной ошибки. +1 !!
  • 0
    В более общем смысле, вы имеете / полностью останавливаете свой скрипт /. die() - это всего лишь один из способов сделать это.
5

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

<?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() функции exit(), чтобы уменьшить нагрузку на сервер:

<? 
header('Status: 301 Moved Permanently', false, 301); 
header('Location: address'); 
exit(); 
?>
  • 0
    Почему (ближе к концу второго пункта)? Вы имеете в виду &para вместо этого (поэтому весь mypage.php?param1=val1&param2=val2) читается как mypage.php?param1=val1&param2=val2) )? (HTML - объект пункт ) является «¶» - возможно , какая - то внешняя программа сделала преобразование?).
5

Лучший способ перенаправления с 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).

Надеюсь, это ясно.

  • 0
    Уже есть ответ с 1085, который содержит информацию, которую вы предоставляете, а также многое другое.
4

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

<?php
header("location:./");//redirect to index file
header("location:index.php");//redirect to index file
header("location:example.php");
?>
3

Мы можем сделать двумя способами

ниже PHP-кода

<?php header("Location: https://bskud.com/PINCODE/BIHAR.php"); exit; ?>

Сохранить выше кода в https://bskud.com/PINCODE/BIHAR/index.php

2.Когда любое условие true, то перенаправление на другую страницу

<?php  $myVar = "bskud";   if ($myVar == "bskud") { ?>  <script> window.location.href="https://bskud.com";  </script> <?php  } else {  echo "<b>Check Website Name Again</b>"; } ?>

`

  • 0
    Что это? Пожалуйста, не используйте ссылки на ваш собственный сайт. А во втором примере используется перенаправление JavaScript, а не функция header() PHP header() .
2

вы можете обновить заголовок в php: header

1

Существует несколько способов сделать это, но если youd предпочитает php, Id рекомендует использовать функцию 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"

authRedirect($_SESSION[‘u_auth’], 5);  // redirects to www.example.com/index.php if the user isn’t auth level 5
authRedirect($_SESSION[‘u_auth’], 4);  // redirects to www.example.com/index.php if the user isn’t auth level 4
authRedirect($_SESSION[‘u_auth’], 2, "www.someotherplace.com/somepage.php");  // redirects to www.someotherplace.com/somepage.php if the user isn’t auth level 2


. . . 

Я надеюсь, что вы найдете полезный контент

Литература;

1
<?php
$url = "targetpage"
Function redirect$url(){
   If (headers_sent()) == false{
      Echo '<script>window.location.href="' . $url . '";</script>';
}}
?>
  • 1
    Не могли бы вы объяснить функцию вашего кода? Ваш ответ был помечен из-за его длины и содержания.
1

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

Redirect 301 / http://new-site.com/
1

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

ob_start();
header("Location: ".$website);
ob_end_flush();
  • 1
    exit () должен использоваться сразу после header (). Кроме того, буферизация была автоматически включена по умолчанию в течение некоторого времени.
0

1. Использование функции php в заголовке in-build

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

<?php

   header('Location: index.php');

?>

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

<?php

      $id = 2;

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

  ?>

2. Перенаправление с javascript в php

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

<?php 

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

 ?>

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

<?php 

     $id = 2;

     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";

   ?>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню