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

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

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


当前回答

使用header()函数发送HTTP位置标头:

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执行。

其他回答

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()。

以下是我的想法:

IMHO,重定向传入请求的最佳方法是使用位置标头

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

一旦执行了该语句并发出输出,浏览器将开始重新引导用户。但是,请确保在发送头之前没有任何输出(任何echo/var_dump),否则会导致错误。

虽然这是一种快速而肮脏的方式来实现最初的要求,但最终会成为一场SEO灾难,因为这种重定向总是被解释为301/302重定向,因此搜索引擎将始终将您的索引页视为重定向页,而不是登录页/主页。

因此,它会影响网站的SEO设置。

Use:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>

1.使用内置PHP函数header

a) 无参数的简单重定向

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

b) 使用GET参数重定向

<?php
      $id = 2;
      header("Location: index.php?id=$id&msg=succesfully redirect");
  ?>

2.在PHP中使用JavaScript重定向

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

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

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