【问题标题】:PHP session.upload_progress Doesn't Work in a Linux/cPanel/Apache Environment (worked in Windows)PHP session.upload_progress 在 Linux/cPanel/Apache 环境中不起作用(在 Windows 中工作)
【发布时间】:2015-01-09 13:17:31
【问题描述】:

很抱歉关于 PHP 中的 session upload_progress 功能的另一个问题,但它让我很难过。我在 Windows 服务器上开发了一个原型文件上传工具,并且进度功能运行良好。但是,当我将原型移到我们的 Linux 服务器上时,它不起作用。尽管文件传输没有问题,但进度数组永远不会出现在 $_SESSION 超全局中。

这里是环境:

  • Apache 版本:2.2
  • PHP 版本:5.4.31
  • 服务器 API:Apache 2.0 处理程序(不是 CGI!)

这里是会话变量:

  • session.upload_progress.cleanup:关闭(关闭,以便在传输后检查 $_SESSION)
  • session.upload_progress.enabled:开启
  • session.upload_progress.freq: 1000
  • session.upload_progress.min_freq: 1
  • session.upload_progress.name: PHP_SESSION_UPLOAD_PROGRESS
  • session.upload_progress.prefix:upload_progress_

这是我的核心文件传输设置:

  • post_max_size: 0
  • upload_max_filesize: 0
  • 最大输入时间:-1
  • max_execution_time:-1
  • 输出缓冲:4096

(我将 output_buffering 参数设置为与上传进度起作用的 Windows 服务器上的设置相匹配。最初,它在 Linux 服务器上“没有价值”)。

这是设置表单的 HTML:

<form name="UploadForm" id="UploadForm" method="post" enctype="multipart/form-data">
<input type="hidden" name="<?php echo ini_get('session.upload_progress.name');?>" id="<?php echo ini_get('session.upload_progress.name');?>" value="1" />
Enter a note to be sent along with your file:<br />
<textarea name="UploadNote" id="UploadNote" rows="5" cols="50"></textarea><br /><br />
<div style="border: thin solid black; padding: 10px;">
Choose the file you wish to transfer and then click the "Upload" button.
<input type="file" name="UploadFile" id="UploadFile" />
<br /><br /><input type="button" id="SubButton" value="Upload" onclick="submit_form('SU')" />

检索上传文件的 PHP 程序在隐藏的 iframe 中启动。状态检查程序通过 jQuery/Ajax 每 1.5 秒调用一次。

就像我说的,upload_progress 代码在 Windows 服务器上运行,并被原封不动地移至 Linux 服务器。我已经检查过的一些事情:

  • 会话完整性很好。我在主程序(设置表单)中添加了我自己的会话变量,并且能够在状态程序和上传程序(在 iframe 中运行)中检索它。会话 ID 都相同。
  • 我的 $_SESSION 项目之外的任何内容都不会添加到 $_SESSION。
  • 同样,文件传输本身工作正常。
  • 其他一些 SO 帖子指出了可能涉及 Apache 缓冲 POST 数据的问题,因此 PHP 仅在文件完全上传后才接收文件。这会导致上传进度数组永远不会发布在 $_SESSION 中吗?我读到 mod-security 可以插入 POST 数据的传输中。所以我暂时在我的 Apache 虚拟主机中禁用了 mod-security,但不幸的是没有帮助。

我不得不认为标准 cPanel Apache 构建中的某些模块会影响 session.upload_progress 功能的运行。有人对尝试什么有任何建议吗?非常感谢。

【问题讨论】:

  • 我几乎可以肯定 mod-security2 是我们的 Linux 服务器上 session.upload_progress 失败的原因。为了关闭它,我使用以下指令对 httpd.conf 进行了(临时!)更改(只是为了看看它是否可以工作): SecRuleEngine Off - 在虚拟主机中领域。但这并没有解决问题!

标签: php session cpanel


【解决方案1】:

我知道它是一个旧线程,但我将把它留在这里,以供其他遇到相同问题的人使用。确实是 mod_security 干扰了 session.upload。 SecRequestBodyAccess 需要设置为 Off 才能使 session.uploads 工作。原因是 SecRequestBodyAccess 缓冲了页面输出,所以 mod_security 可以处理页面。

Mod Security Documentation SecRequestBodyAccess

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2017-03-16
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多