是否可以通过使用PHP将用户重定向到不同的页面?

假设用户转到www.example.com/page.php,我想将其重定向到www.example.com/index.php,那么在不使用元刷新的情况下,我如何做到这一点?有可能吗?

这甚至可以保护我的页面免受未授权用户的攻击。


当前回答

Use:

<?php header('Location: another-php-file.php'); exit(); ?>

或者,如果您已经打开了PHP标记,请使用以下命令:

header('Location: another-php-file.php'); exit();

您还可以重定向到外部页面,例如:

header('Location: https://www.google.com'); exit();

确保包含exit()或includedie()。

其他回答

现有答案汇总加上我自己的两分钱:

1.基本答案

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

header('Location: '.$newURL);

2.重要细节

die()或exit()

header("Location: https://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.文件

PHP中的HTTP Headers和header()函数

PHP手册的内容维基百科说什么W3C的说法

4.备选方案

您可以使用http_redirect($url);这需要安装PECL包PECL。

5.助手函数

此功能不包含303状态代码:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('https://example.com/', false);

这更加灵活:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6.解决方法

如前所述,header()重定向只在写入任何内容之前生效。如果在midst HTML输出中调用,它们通常会失败。然后,您可以使用HTML标头解决方法(不是很专业!),如:

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

甚至是JavaScript重定向。

window.location.replace("https://example.com/");

您可以使用会话变量控制对页面的访问并授权有效用户:

<?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地址和用户会话的日志访问,因为我不想打扰我的数据库。

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()/ext()!

您可以尝试使用PHP头函数进行重定向。您需要设置输出缓冲区,以便浏览器不会向屏幕发出重定向警告。

ob_start();
header("Location: " . $website);
ob_end_flush();

这些答案中的许多都是正确的,但它们假设您有一个绝对的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