【问题标题】:fputs doesn't write before 403 header is triggeredfputs 在触发 403 标头之前不写入
【发布时间】:2017-04-26 14:13:51
【问题描述】:

我有一个函数forbid(),它应该写入一个访问被拒绝的日志文件,以及拒绝的原因。由于某种原因,它没有写入日志文件。

// function to forbid access
function forbid($reason) {
    // explain why
    if ($reason) fputs($file, "=== ERROR: " . $reason . " ===\n");
    fputs($file, "*** ACCESS DENIED ***" . "\n\n\n");
    fclose($file);

    // forbid
    header("HTTP/1.0 403 Forbidden");
    exit;
}

$file是在代码前面定义的,这个函数之前的其他fputs()都可以正常工作;我认为这是关于 403 标头导致它无法写入的问题。

【问题讨论】:

  • 我认为这是关于 $file 的问题,未在函数范围内定义。
  • 如果你想在函数中使用$file,你应该使用use 语句或者直接将它作为参数传递给你的函数。
  • 这是一个命名函数定义,use 用于匿名函数。
  • 我在发布的函数中看不到变量$file 的任何定义/初始化。它是NULL,这就是fputs() 失败的原因。阅读variable scope。我会将$file 作为函数forbid() 的第一个参数传递,并且 使用globalheader() 函数是无罪(这也适用于403。)

标签: php logging http-status-code-403 fputs


【解决方案1】:

看起来像是范围问题。由于它是一个函数,它在函数范围内寻找文件句柄$file,而不是全局。您需要将文件句柄传递给函数。

我还将假设错误报告已关闭,从而抑制了您的问题。

【讨论】:

  • 啊,就是这样。我不知道为什么我没有想到它:) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
相关资源
最近更新 更多