如何在 PHP 中进行重定向?

是否可以通过使用 PHP 将用户重定向到其他页面?

假设用户转到www.example.com/page.php并且我想将其重定向到www.example.com/index.php ,那么在不使用元刷新的情况下该怎么做?可能吗?

这甚至可以保护我的页面免受未经授权的用户的侵害。

答案

现有答案的摘要加上我自己的两分钱:

1. 基本答案

您可以使用header()函数发送新的 HTTP 标头,但是必须在任何 HTML 或文本之前(例如,在<!DOCTYPE ...>声明之前)将其发送到浏览器。

header('Location: '.$newURL);

2. 重要细节

die()exit()

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

为什么要使用die()exit()每日 WTF

绝对或相对 URL

自 2014 年 6 月起,绝对 URL 和相对 URL 均可使用。请参阅RFC 7231 ,该文件已替换了旧的RFC 2616 ,其中仅允许绝对 URL。

状态码

PHP 的 “位置” 标头仍使用HTTP 302重定向代码,但这不是您应该使用的代码。您应该考虑301 (永久重定向)或303 (其他)。

注意: W3C 提到 303 标头与 “许多 HTTP / 1.1 之前的用户代理不兼容。当前使用的浏览器都是 HTTP / 1.1 用户代理。对于其他许多用户代理(例如蜘蛛网和漫游器)而言,情况并非如此。

3. 文件

HTTP header()头和 PHP 中的header()函数

4. 替代方案

您可以使用http_redirect($url);的替代方法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);

不要忘记 die()/ exit()!

使用 echo 从 PHP 输出 JavaScript,即可完成工作。

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

除非缓冲页面输出然后在以后检查重定向条件,否则您实际上无法在 PHP 中执行此操作。那可能太麻烦了。请记住,标题是从页面发送的第一件事。大多数重定向通常在页面的稍后部分是必需的。为此,您必须缓冲页面的所有输出,并在以后检查重定向条件。那时,您可以重定向页面用户 header()或仅回显缓冲的输出。

有关缓冲的更多信息(优势)

什么是输出缓冲?

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

这些答案大多数都忘记了非常重要的一步!

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

撇开第二条至关重要的线,您可能最终会进入《每日 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:../");
        exit();
    }

    // Page goes here
?>

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

最近,我受到了网络攻击,并决定要了解试图访问管理面板或 Web 应用程序保留部分的用户。

因此,我在文本文件中添加了 IP 地址和用户会话的日志访问权限,因为我不想打扰我的数据库。

这些答案中有许多是正确的,但它们假定您具有绝对 URL,而事实并非如此。如果要使用相对 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' );