为什么PHP在任何给定时刻都没有重定向页面的功能?

时间:2013-05-07 16:57:31

标签: php redirect

我知道您可以使用header('Location: next.php')来完成该解决方案以及其他可能的解决方案,但必须在将任何输出发送到客户端之前使用。我的问题是为什么PHP在任何给定时间都不支持页面重定向的功能。我只是想知道为什么,对解决方案或解决方法不感兴趣。感谢。

8 个答案:

答案 0 :(得分:1)

因为它确实是客户端功能。这就是你使用HTML来实现这一目标的原因。

<META http-equiv="refresh" content="5;URL=http://www.google.com">

答案 1 :(得分:0)

PHP是一种服务器端语言,因此在客户端上显示之前,所有内容都在服务器上进行预处理...因此,任何PHP重定向都应该在将任何内容发送到客户端之前发生...重定向需要在页面之后完成加载必须发生在客户端JS或元刷新代码。

答案 2 :(得分:0)

您必须记住PHP 服务器端 语言。因此,一旦页面加载到客户端的浏览器上,您就不再拥有对它的控制或访问权限。在内容离开服务器后,无法操纵客户端浏览器窗口的加载,重新加载或重定位。

答案 3 :(得分:0)

原因是因为您引用的函数使用HTTP标头发送重定向。

HTTP标头必须(在顾名思义)在响应开始时,在任何实际内容之前发送。

只要您发送了任何内容,就无法再发送任何HTTP标头了。这就是为什么它不起作用。

可以使用ob_start()函数将PHP设置为不发送任何内容。如果您这样做,能够在生成输出后发送重定向。这是因为HTTP内容不是使用此方法发送的,因此它仍然可以发送HTTP标头。

但在正常情况下,发送任何正文内容意味着您无法发送任何后续标题。

还有其他Javascript方法可以触发重定向,可以在页面主体内容中完成,但这些方法完全不同,并且不能作为标准PHP函数使用。通过将相关的javascript代码作为HTTP内容输出的一部分发送,可以很容易地调用它们。

答案 4 :(得分:0)

这是因为要进行HTTP重定向,重定向必须位于响应头中。标题位于内容正文之前。输出任何正文后,您将无法发送标题。

答案 5 :(得分:0)

因为您在开始发送正文后无法发送标题。

  1. HTTP标头
  2. HTTP正文
  3. 就是这样。一旦脚本输出任何内容,PHP就会开始发送响应(即标题和正文的一部分)。因此,无法在代码中的任何给定时间添加重定向标头。

答案 6 :(得分:0)

因为HTTP不支持它。

HTTP协议实质上将响应拆分为3部分:

  1. 描述请求结果的数字代码和描述(即200 OK
  2. 描述发送内容的标题
  3. 回复的内容
  4. PHP认为1和2都是标题,但HTTP在开始刷新内容后根本无法添加新标题(步骤3)。因此,您必须在发送内容之前指定重定向,因为这意味着响应代码将更改为3xx范围内的数字,并添加了Location标头。

    通过使用输出缓冲,您可以在某种程度上通过强制PHP在生成内容时立即发送内容来缓解此行为:

    ob_start();
    

    在此调用之后,所有输出都被缓冲,直到您显式刷新它或脚本结束,允许您仍然更改标题。尽管使用它是不好的做法,但在开始渲染输出之前确定请求的结果要好得多。

答案 7 :(得分:-1)

  1. 在php.ini中启用output_buffering,然后您可以在任何地方使用位置
  2. 使用框架 - 它们通常具有功能
  3. “手动”使用缓冲:ob_start(); ob_get_contents()等 然后,您可以在代码
  4. 中使用ANYWHERE重定向

    您还可以使用JS解决方案:

    <script>location.href="/";</script>
    

    甚至是HTML中的元重定向。只需用PHP输出HTML / JS代码,它就会重定向。