是否可以通过使用 PHP 将用户重定向到不同的页面?
假设用户访问www.example.com/page.php
并且我想将它们重定向到www.example.com/index.php
,如何在不使用元刷新的情况下这样做?可能吗?
这甚至可以保护我的页面免受未经授权的用户
现有答案摘要加上我自己的两分钱:
您可以使用header()
函数发送新的 HTTP 标头,但必须在任何 HTML 或文本之前将其发送到浏览器(例如,在<!DOCTYPE ...>
声明之前)。
header('Location: '.$newURL);
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 用户代理。对于蜘蛛和机器人等许多其他用户代理来说并非如此。
HTTP header()
头和 PHP 中的header()
函数
您可以使用http_redirect($url);
的替代方法http_redirect($url);
需要安装PECL 包 pecl 。
此功能不包含 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();
}
如前所述, 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);
别忘了 die() / exit()!
使用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 执行。