Apache AH01328 行太长尝试下载损坏的文件时出错

Apache AH01328 Line too long Error when trying to download a corrupted file

我一直在使用 Apache 作为我的 Apache Tomcat 服务器的反向代理时遇到这个错误,每当我尝试下载损坏的 PDF 时,服务器的响应为空,我在 Apache 上得到这个日志:

AH01328: Line too long, URI /uri/moreruri/docNum, referer: https://example.com/uri/moreruri/docNum

我试图在我的本地服务器上遇到同样的错误(再次使用 Apache 和 Apache Tomcat),但没有发生。

知道为什么会发生这种情况吗?提前致谢。

此错误的发生是因为 /conf/httpd.conf 配置文件中的这一行:

AddOutputFilterByType SUBSTITUTE application/pdf

这里 Apache 试图做的是,每当 GET 完成并且 GET 返回 PDF 文件时,它会尝试读取文件并替换特定的文本字符串。

这些替换在此行定义:

Substitute "s|http://localhost:8081|https://example.com|in"

当 apache 收到 GET 并看到我们正在请求 PDF 文件时,它会尝试读取它并替换那些字符串,但是由于文件已损坏,apache 无法读取它。

然后它将所有 PDF 内容放入响应正文内的一行中,这恰好(在我们的特定情况下)大于默认的最大行长度(以 MB 为单位)。

这导致响应被截断,最后得到的是空响应。

我们也有这条线:

SubstituteMaxLineLength 5M

它更改了默认的最大行长度,但是我们的文件权重为 20MB,这里我们将最大长度设置为 5MB,因此不涵盖这种特定情况。

我们解决问题的方法是简单地删除第一行,因为我们不需要更改 PDF 的内容:

AddOutputFilterByType SUBSTITUTE application/pdf

您可能希望使用此行更改最大长度:

SubstituteMaxLineLength LENGTH

我不建议这样做,因为出于安全原因,默认情况下限制较低。

如果使用 Apache 服务器,请将其添加到 .htaccess 文件中:

<IfModule mod_substitute.c>
SubstituteMaxLineLength 10M
</IfModule>