协慌网

登录 贡献 社区

如何在 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。请参阅RFC 7231 ,它已替换旧的RFC 2616 ,其中只允许使用绝对 URL。

状态代码

PHP 的 “Location”-header 仍然使用HTTP 302 -redirect 代码,但这不是您应该使用的代码。您应该考虑301 (永久重定向)或303 (其他)。

注意: W3C 提到 303-header 与 “许多 pre-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/");
function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

别忘了死()/ 退出()!

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