我有一个 FastCGI 脚本,它开始为请求创建文件,并在将新文件的第一部分写入硬盘后立即将重定向标头发送到客户端,其中包含新文件的位置。一切正常,但当客户端从重定向请求文件时,它会收到 Content-lenght 标头,其中包含在发出请求时已写入文件的文件长度,并且客户端不会收到在请求后创建的文件部分。
如何配置 Apache 以避免发送未完成文件的 Content-lenght 标头并继续发送文件直到发送整个完成的文件?
问候,
米哈尔·皮特拉斯。
答案1
我不确定我是否理解了你的问题,但听起来你有一个开始写入 File 的过程,A
向客户端发送一个 3xx 系列重定向消息,告诉它去获取 File A
,然后继续写入 File A
。
如果发生这种情况,您的客户端可能会在文件A
写入完成之前请求文件,并且它会得到正确的文件内容的内容长度当被要求。
如果您想要发送整个文件,则需要在发出重定向之前完成写入操作。
答案2
我还没有测试过,但可以尝试使用mod_header:
Header unset Content-Length
如果不完整的文件都在同一个目录中,您可以将其放在目录部分中,或者如果更合适,可以放在其他块中。
请注意,这会破坏 RFC 行为,而且我不确定 Apache 在删除标头后是否真的能够传输整个文件 - 据我们所知,它可能仍使用独立于该特定标头的内部计数器。
答案3
根据在这里回答,你必须改变 apache 的源代码才能做到这一点。根据这里有问答,如果在 apache 中启用 gzip 压缩,它会产生禁用 content-length 标头的副作用,因为 apache 在压缩完成之前不会知道长度,而到那时它已经开始发送压缩数据。
无论如何,我认为你尝试做的事情不会成功,除非你的“该文件的第一部分”太大,以至于 Apache 无法在向其写入另一大块数据之前读取到它的末尾(Apache 的缓冲区、内核的 TCP 发送缓冲区、网络的缓冲区等)。还请注意,如果 apache 使用 sendfile()(在 Linux 上几乎肯定是这样的,除非你使用 gzip 或 SSL 或你把它关掉) 然后将要发送的数据的长度提供给 sendfile() 函数,这将是 apache 开始发送时文件的长度。