【问题标题】:PHP redirect using session [duplicate]PHP使用会话重定向[重复]
【发布时间】:2014-01-21 20:07:09
【问题描述】:

我创建了一个 PHP 票务系统。将我的脚本上传到网络时,重定向到第二页时出现以下错误:

警告:无法修改标头信息 - 标头已由...输出从第 29 行开始。

我在本地电脑上使用 wampserver 开发时没有出现此错误。

票务 PHP 由两个页面组成:

  1. 首页:HTML 表单,PHP 在点击提交后验证输入。如果一切正常 ==> 重定向到第二页。
  2. 第二页:选择门票。

我意识到我收到此错误是因为我在重定向到另一个页面之前输出了 HTML。我该如何解决这个问题? (因为我必须输出 HTML)

亲切的问候

【问题讨论】:

  • 使用输出缓冲的各种解决方案,但是如果您坚持“进程优先”规则(这也是表示各种标题和重定向)输出任何东西ob_start() 是您可以使用的拐杖,但为此,它的代码味道很差。简而言之:不要编写您的应用程序在尚未完成处理时输出 HTML,如果您决定要输出其他内容,如 xml、pdf、json 等,会发生什么?
  • 为什么要在重定向之前输出 HTML?
  • 听起来你在会话前输出东西。你能提供你的代码吗?
  • 附带说明,由于 php.ini 中的 display_errors 设置不同,您可能没有在本地服务器上收到警告消息。您还应该在生产中禁用它。
  • 这可能是很多事情。 <?php 之前的空格、选项卡、HTML、一些隐藏字符、cookie、包含文件、字节顺序标记等等等。正如 Wrikken 所写,您可以使用 ob_start(); 作为最后的手段。旁注:最好不要使用结束 ?> 它不需要。

标签: php html session redirect


【解决方案1】:

确保在调用header()session_start() 之前没有任何输出

  • 确保所有 php 文件中 <?php 之前的任何位置都没有空格
  • 删除每个php文件末尾的?>
  • 在您的开发机器上将php.ini 中的error_reporting 更改为E_ALL 并将display_errors 更改为On,然后再次运行您的应用程序并查看是否有任何错误。修复它们。

【讨论】:

    【解决方案2】:

    那条消息也让我多次感到沮丧。这个解决方案应该可以解决它:

    echo '<meta HTTP-EQUIV="REFRESH" content="0; url=newurl.php">';
    

    content="0; 中的数字零表示重定向前暂停的秒数。

    我想不用说您必须将 newurl.php 替换为所需的页面名称......只是说......

    由于上述内容有其批评者,虽然我自己使用它没有明显的负面结果,但这里有一些替代方案:

    Redirects - alternative to "<meta http-equiv='refresh' />"?

    上面 Sam Dufel 评论中链接的文章非常棒:

    How to fix "Headers already sent" error in PHP

    【讨论】:

    • 这只是解决问题的技巧。该问题实际上应该得到解决(即在尝试重定向之前不要输出到浏览器)。修复实际问题不要添加hack来掩盖问题。
    • 破解是别人不喜欢的修复。
    • 在这种情况下,黑客就是黑客。这甚至比正常情况更糟,因为通过典型的服务器标头没有指示需要重定向,也不能保证浏览器会遵守元刷新。
    • 你对这个迈克很有热情。鉴于你的 SO 代表,我相信你有你的理由。尽管许多人继续使用这种方法而没有负面后果,但我期待您对这个问题的回答。
    • 我不打算回答这个问题,因为它确实与已经在 SO 上多次提出的问题重复。如果我要回答,我会给出类似于 vooD 给出的答案,尽管我会特别提到,当它提到“输出从第 29 行开始”时,错误消息会准确地告诉他哪一行代码是可能的违规行跨度>
    【解决方案3】:

    冒着被这个牺牲品的风险,但你可以让javascript重定向你:

    <?php
    // instead of header('Location: someURL.php');
    die('<script>window.location = \'someURL.php\';</script>');
    ?>
    

    否则,不要在header() 调用之前输出ANYTHING。遵守规则,快乐编码 =)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多