告诉 apache 将 text/plain 的 LF 转换为 CRLF

告诉 apache 将 text/plain 的 LF 转换为 CRLF

问题:我想CRLF从编码为LF

我有一个Apache2 httpd基于 Linux 的 Web 服务器,配置为提供*.log由基于 Linux 的模拟器生成的(大型)日志文件()。

这些日志文件具有 Unix 样式的LF结尾而不是 Windows 样式的结尾CRLFCRLF这也成为协议中文本文件的标准http

当我使用 Windows 中的浏览器查看它们时,它们会被加载到 Notepad.exe 中,并且所有文本都(错误地)在同一行上;除非我将服务器上的日志从 重命名 *.log*.txt

看起来 Microsoft Windows 可能正在进行*.txt特殊处理,并在结尾出现时进行转换。

有了这些线索,我该如何更改设置,以便客户端用户能够正确查看文件,而不管他们的平台/浏览器如何。


更多问题细节:为什么我不能做显而易见的事情

分析日志,我发现以 mime-type和的形式.txt提供,但切换到使用并没有解决问题。text/plain.logtext/x-log.logtext/plainSetType

在生产系统中,我无法轻易地将文件更改为以 结尾.txt

对于我来说,日志数量太多、太大,无法使用(例如unix2dos)进行转换并保存另一份副本。此外,这还会迫使我管理转换文件的额外缓存,这些缓存需要失效、清除等,或者更改原始文件,这可能会破坏使用这些文件的其他系统。

  1. 是否有一个 Apache httpd 配置参数可以告诉 Windows/Internet Explorer(和其他操作系统/浏览器)它在到达时需要LF扩展吗?CRLF
  2. 或者我能否以某种方式告诉 Apache在提供服务时动态地LF进行替换?CRLF

我尝试过

我查看了捆绑的 Apachemod_mime模块及其指令AddTypeAddCharset但这些都不能解决问题,甚至声称不能。

Apache 文档没有提及行尾问题。

该类型的 MIME 文档text说明了内容必须采用 CRLF 格式

字符集编码标准似乎没有考虑行尾。

答案1

看来您要费很大劲才能解决 Notepad 的一个(在我看来很严重)限制。是否可以在系统上安装更智能的文本编辑器,例如 Notepad++?

答案2

我采用的(不完美的)解决方案是使用 Apache 的mod_ext_filter

ExtFilterDefine logwin mode=output cmd=/usr/bin/unix2dos intype=text/x-log
AddOutputFilter logwin .log
# Note that apache2 defines .log as having mime-type text/x-log by default.

本质上,这意味着对于以 结尾的任何文件.log,在传送给客户端之前都应该经过行尾转换器。

对于负载很重的机器来说,这不是一个好的解决方案,因为分叉unix2dos比让 Apache 内部处理要慢。它还需要在每次读取文件时进行转换,效率很低。

遗憾的是,Apache 基金会没有为这种情况提供内置的 mod 过滤器,而且我也没有时间去编写/维护一个。

不过,我并不期望这台机器的负载太高,因此从工程工作量来衡量,这是一个很好的解决方案。

  • 符合mimetext/plain 的规格通过CRLF在线编码
  • 客户端无需采取任何特殊操作。虽然我很乐意使用更好的文本编辑器,但我不能指望所有用户都改用它
  • 如果我需要移动网络服务器,重新配置很容易
  • 不需要日志生成器使用非本机(非 unix)行尾格式

相关内容