【问题标题】:Using functions like header() and setCookie() after output in a website在网站输出后使用 header() 和 setCookie() 等函数
【发布时间】:2014-11-27 22:48:40
【问题描述】:

我正在开发一个带有登录系统的网站。如果用户成功登录,则会设置一个 cookie。代码看起来有点像:

if(!success)
    echo "denied";
else
    setCookie(x,x,x,x,x);

现在,问题是这样的代码除了在本地测试服务器 (localhost) 上之外,无法在其他任何地方运行。现在,我的问题是,有没有标准化的方法来解决这个问题?还是开发人员必须编写自己的代码才能避免出现此类问题?

【问题讨论】:

  • '... cookie 必须在脚本的任何输出之前发送(这是协议限制)...' PHP: setcookie
  • 检查这个链接PHP Cookies with Login它会帮助你
  • @user45562 谢谢。事实上,我知道就是这样。我想知道一种解决方法。
  • 该代码应该能够要么发送输出或设置cookie。如果您确实在发送 cookie 之前发送输出,实际上有一种解决方法允许输出被临时缓存,然后存储在变量中或之后发送到浏览器。
  • 您应该检查并确保实际的文件编码。如果 UTF-8 确保它没有 BOM,否则它可能会在浏览器执行任何 PHP 之前向浏览器发送一小段数据。这是因为引擎将第一个字节解释为原始纯文本/HTML 以发送到浏览器。这显然违反了 header() 和 setCookie() 的要求。

标签: php http setcookie


【解决方案1】:

您可以使用ob_startob_end_flush 来激活特定代码的输出缓冲:

ob_start()
< code >
ob_end_flush()

或者您可以从 php.ini 激活所有页面的输出缓冲:

output_buffering = 'On'

【讨论】:

  • 我不知道第二个选项,但如果第一个不起作用,那就是 BOM 问题。
  • 感谢您的回答。这只是一种解决方法,还是通常的方法?
  • @MartinHoffmann 这是一种解决方法,通常的方法是在任何输出之前发送标头和 cookie。在生产服务器中output_buffering 的推荐值是4096(默认值),这是为了减少数据包碎片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多