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

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

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

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

1013
задан Sam 20 апр. '09 в 17:13
источник поделиться
28 ответов

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

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/");
1440
ответ дан markus 20 апр. '09 в 17:19
источник поделиться
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
ответ дан Alix Axel 20 апр. '09 в 17:19
источник поделиться

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

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

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

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

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

88
ответ дан Hammad Khan 27 июня '14 в 10:24
источник поделиться

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

83
ответ дан vartec 20 апр. '09 в 17:14
источник поделиться

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
?>
58
ответ дан Juned Ansari 13 апр. '17 в 15:44
источник поделиться

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

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

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

50
ответ дан nickf 20 апр. '09 в 17: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()

23
ответ дан jake 16 мая '16 в 16:12
источник поделиться

Многие из этих ответов верны, но они предполагают, что у вас есть абсолютный 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
18
ответ дан Luke 15 янв. '14 в 7:21
источник поделиться

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

<?php

session_start();

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

// Page goes here
?>

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

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

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

17
ответ дан Asuquo12 09 сент. '16 в 13:48
источник поделиться

Я уже ответил на этот вопрос, но я сделаю это снова, так как между тем я узнал, что есть особые случаи, если вы работаете в 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)
13
ответ дан Alix Axel 29 апр. '11 в 0:31
источник поделиться

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

12
ответ дан Daniel A. White 20 апр. '09 в 17:14
источник поделиться
header("Location: /index.php");
exit(0);   
10
ответ дан joan16v 12 янв. '15 в 14:03
источник поделиться

вы можете использовать некоторые 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");
8
ответ дан Vikram Pote 12 марта '15 в 12:42
источник поделиться

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

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

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

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

7
ответ дан CasperSL 28 нояб. '17 в 4:04
источник поделиться
<?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.
?>
7
ответ дан Obaidul Haque 18 авг. '17 в 9:46
источник поделиться

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

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

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

6
ответ дан Henrik Paul 20 апр. '09 в 23:25
источник поделиться

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

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

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

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

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

6
ответ дан Bhaskar Pramanik 28 янв. '17 в 17:48
источник поделиться

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

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

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

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

6
ответ дан Brent 20 апр. '09 в 17:23
источник поделиться

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

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

5
ответ дан sabuz 09 апр. '17 в 11:37
источник поделиться

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

<?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(); 
?>
4
ответ дан Star 13 февр. '18 в 12:26
источник поделиться

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

<?php
header("location:./");//redirect to index file
header("location:index.php");//redirect to index file
header("location:example.php");
?>
4
ответ дан Bhargav Chudasama 08 июня '17 в 9:34
источник поделиться

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

ниже 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>"; } ?>

`

3
ответ дан Kavita Sharma 04 янв. '18 в 10:30
источник поделиться

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

2
ответ дан Zack Marrapese 20 апр. '09 в 17:14
источник поделиться

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

ob_start();
header("Location: ".$website);
ob_end_flush();
1
ответ дан Doruk Ayar 15 нояб. '16 в 13:15
источник поделиться
<?php
$url = "targetpage"
Function redirect$url(){
   If (headers_sent()) == false{
      Echo '<script>window.location.href="' . $url . '";</script>';
}}
?>
1
ответ дан Joshua Charles Pickwell 20 нояб. '17 в 22:10
источник поделиться

Существует несколько способов сделать это, но если 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
ответ дан Pyr James 29 янв. '18 в 1:17
источник поделиться

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

Redirect 301 / http://new-site.com/
1
ответ дан jabko87 13 окт. '17 в 13:56
источник поделиться

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>";

   ?>
0
ответ дан Shaan Ansari 03 авг. '18 в 16:26
источник поделиться

Другие вопросы по меткам