在APACHE中记录动态提供的文件

时间:2010-01-18 06:02:27

标签: php apache zip

我正在通过PHP使用以下输出动态提供Zip和PDF文件:

header('Content-Disposition: attachment; filename="'.$project->name .'.zip"');
echo($zipfile->zl_pack());

我在APACHE日志中找不到对这些下载的任何引用。是否由于动态而没有记录?

我是否需要将文件实际写入网络服务器,然后提供结果以使其记录或我遗失了什么?

干杯, Niggles

4 个答案:

答案 0 :(得分:0)

正确。 httpd不会查看用于记录的传出标头。 error_log()会向httpd的错误日志发送消息,但是无法在访问日志中添加内容。

答案 1 :(得分:0)

应记录对生成该标头的PHP程序的请求。内容处置标题中提到的文件名不会是。

我相信mod _ perl would allow you to add custom logging,我不知道mod_php是否提供了类似的功能。

答案 2 :(得分:0)

作为一种解决方法,你可以使用mod_rewrite来记录* .zip文件并仍然通过PHP提供它而不实际将其写入文件系统,客户端将不得不发送两个请求。

1)更改当前脚本,使其不生成文件,而是将文件创建所需的参数放入会话中;而不是当前的标题和文件内容,而是放置header('Location: '.$project->name .'.zip');

2)这会导致第二个请求。由于请求的文件尚不存在,您可以使用mod_rewrite将对* .zip文件的请求更改为从会话中读取参数的相同或其他PHP脚本,并生成文件就像您正在执行它一样现在。如果你使用相同的PHP脚本,你还可以让mod_rewrite在请求中添加一些参数,如“?action = produceFile”,然后在脚本中测试该参数。

通过这种方式,您可以在Apache日志中拥有两个不错的条目,而无需在物理上保存文件(以后可能会将其删除)。

答案 3 :(得分:0)

仅供参考我找到了一个非常好的解决方法。

部分问题是我们想要强制“另存为”对话,因为许多用户对文件保存位置感到困惑。所以这就是我去

的原因
Content-Disposition : attachment

方法

仍然调用对话框的更好方法是将其添加到.htaccess

<Files *.zip>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>

将Zip写入文件服务器并将页面重定向到zip。

当然我每晚必须清理,但它会被记录下来并且仍然会强制他们选择下载文件的位置(除了Safari之外几乎所有东西都有)。

干杯, Niggles