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

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

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

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

1140
20 апр. '09 в 17:13
источник поделиться
32 ответов
  • 1
  • 2

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

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/");
1579
20 апр. '09 в 17:19
источник

Связанные вопросы


Похожие вопросы

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

103
20 апр. '09 в 17:14
источник
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()!

102
20 апр. '09 в 17:19
источник

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

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

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

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

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

93
27 июня '14 в 10:24
источник

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
?>
81
13 апр. '17 в 15:44
источник

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

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

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

52
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
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
15 янв. '14 в 7:21
источник

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

<?php
    session_start();

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

    // Page goes here
?>

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

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

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

18
09 сент. '16 в 13:48
источник

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

13
20 апр. '09 в 17:14
источник

Я уже ответил на этот вопрос, но я сделаю это снова, так как тем временем я узнал, что есть особые случаи, если вы работаете в 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
29 апр. '11 в 0:31
источник
header("Location: /index.php");
exit(0);   
10
12 янв. '15 в 14:03
источник

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

8
12 марта '15 в 12:42
источник

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

<?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
18 авг. '17 в 9:46
источник

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

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

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

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

7
28 нояб. '17 в 4:04
источник

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

header("Location: index.php");

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

echo "<script>window.open('your path where you redirect ','_self')</script>";
7
11 апр. '19 в 7:59
источник

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

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

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

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

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

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

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

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

Заголовки HTTP

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

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

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

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

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

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

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

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

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

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

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
7
13 февр. '18 в 12:26
источник

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

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

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

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

6
20 апр. '09 в 17:23
источник

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

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

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

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

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

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

6
28 янв. '17 в 17:48
источник

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

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

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

6
20 апр. '09 в 23:25
источник

Лучший способ перенаправить с помощью 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
09 апр. '17 в 11:37
источник

для перенаправления используйте этот код

header("Location: http://www.example.com/blog");
4
21 марта '19 в 3:51
источник

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

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

<?php
    header("location:./"); // Redirect to index file
    header("location:index.php"); // Redirect to index file
    header("location:example.php");
?>
4
08 июня '17 в 9:34
источник

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

  1. Когда пользователь заходит на 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 the website name again</b>";
        }
    ?>
    
3
04 янв. '18 в 10:30
источник

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>";
   ?>
2
03 авг. '18 в 16:26
источник

Есть два способа перенаправления

Используя PHP

<?php 

header("Location: http://example.com/page.php");
die();
?>

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

<script>

     $(document).ready(function(){
    location.href = 'http://example.com/page.php';
     });

</script>
2
29 мая '19 в 9:34
источник

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

2
20 апр. '09 в 17:14
источник

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

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>
2
20 нояб. '17 в 22:10
источник

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

ob_start();
header("Location: " . $website);
ob_end_flush();
1
15 нояб. '16 в 13:15
источник

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

Redirect 301 / http://new-site.com/
1
13 окт. '17 в 13:56
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос