如何在PHP中进行重定向?
使用header()
函数发送一个HTTP Location
header:\n\n
header('Location: '.$newURL);
\n\n与一些人的想法相反,die()
与重定向无关。仅在想要重定向而不是正常执行时使用它。\n\n文件example.php:\n\n
\n\n三次执行的结果:\n\n
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
\n\n恢复 - 必须要使用die()
/exit()
是一种与实际PHP无关的城市传说。这与客户端“尊重”Location:
头文件无关。发送头文件不会停止PHP执行,无论所使用的客户端如何。
现有答案的总结以及我的两个观点:
1. 基本答案
您可以使用header()
函数发送新的HTTP头,但必须在任何HTML或文本之前将其发送到浏览器(例如,在声明之前)。
header('Location: '.$newURL);
2. 重要细节
die()或exit()
header("Location: https://example.com/myOtherPage.php"); die();
为什么应该使用die()
或exit()
:The Daily WTF
绝对或相对URL
自2014年6月以来,绝对和相对URL均可使用。请参阅RFC 7231,该标准已替换旧版的RFC 2616,旧版要求仅使用绝对URL。
状态码
PHP的“Location”头仍使用HTTP 302重定向代码,这是一个“临时”重定向,可能不是您应该使用的代码。您应该考虑使用301(永久重定向)或303(其他)。
注意:W3C提到,303-header与“许多不支持HTTP / 1.1的用户代理不兼容。目前使用的浏览器都是HTTP / 1.1用户代理。这对于许多其他用户代理(如蜘蛛和机器人)不适用。
3. 文档
HTTP标头和PHP中的header()
函数
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()
重定向只在任何内容被写入之前起作用。如果它们在HTML输出中被调用,它们通常会失败。那么您可以使用一个HTML标题解决方法(不是非常专业!)例如:
或者甚至使用JavaScript重定向。
window.location.replace("https://example.com/");