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

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

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


当前回答

使用echo从PHP输出JavaScript,这将完成任务。

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

除非缓冲页面输出,然后稍后检查重定向条件,否则在PHP中无法真正做到这一点。这可能太麻烦了。记住,头是从页面发送的第一件事。大多数重定向通常需要在页面的后面进行。为此,您必须缓冲页面的所有输出,并在稍后检查重定向条件。此时,您可以重定向页面用户header()或简单地回显缓冲的输出。

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

什么是输出缓冲?

其他回答

有多种方法可以做到这一点,但如果您更喜欢php,我建议使用header()函数。

大体上

$your_target_url = “www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

如果你想把它提升一个档次,最好在函数中使用它。这样,您就可以在其中添加身份验证和其他检查元素。

让我们通过检查用户的级别来尝试。

因此,假设您已将用户的权限级别存储在名为u_auth的会话中。

在函数.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”

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);

    . . .

参考文献;

http://php.net/manual/en/function.header.php

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

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

如果您在Apache上运行,也可以使用.htaccess进行重定向。

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

使用标头函数进行路由

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

假设我们想要从A.php文件路由到B.php,那么我们需要借助<button>或<A>。让我们看一个例子

<?php
if(isset($_GET['go_to_page_b'])) {
    header('Location: B.php');
    exit();

}
?>

<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>

B.php语言

<p> I am Page B</p>

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

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