1

我有一个相当正常的设置,其中 Apache 代理请求通过 AJP 协议在 Tomcat 内运行的 servlet。

我们已经在 Apache 2.0.46/Tomcat 5.0.28 上运行此设置多年没有问题,但最近更新到 Apache 2.2.3/Tomcat 5.5。

问题是我们已经注意到间歇性地(可能是 3 次)Apache 会以某种方式将 servlet 提供的页面的“Content-Type”HTTP 标头从“text/html”转换为“text/plain”,这导致浏览器显示 HTML 源代码而不是渲染它。

有没有人见过这种行为并知道可能是什么原因?我怀疑我们在 servlet 代码中做了一些坏事,旧版本的 Tomcat/Apache 更宽容。

更新:我已经确认是 Apache 更改了标题。如果我直接浏览到 Tomcat,则不会出现问题。

4

6 回答 6

6

一些 web 应用程序没有正确设置它们所服务的 MIME 类型,但在独立服务时仍然可以正常工作,因为像浏览器这样的客户端应用程序能够解释内容的类型。但是当在 Apache 后面提供服务时,这些应用程序将无法正常运行,因为 Apache 将提供默认类型的 text/plain。

一个解决方案是为这些 Web 应用程序添加 DefaultType None 行到您的 apache 虚拟主机:

DefaultType None

http://httpd.apache.org/docs/2.2/mod/core.html#defaulttype

从我的博客文章: http: //patternbuffer.wordpress.com/2011/11/30/mime-type-issue-with-apache-mod_jk-and-mod_proxy-serving-plain-text/

于 2011-12-01T00:32:57.330 回答
0

如果您间歇性地看到此问题,则几乎可以肯定是 servlet 代码中存在问题,而不是 Tomcat 或 httpd 配置错误。您是否有可以打开以打印 HTTP 标头内容的日志记录?

为了进一步隔离问题,您还可以尝试绕过 httpd 并直接访问页面的 Tomcat URL。

我之前没有见过这种特殊的行为,所以很抱歉我不能更具体。

于 2009-06-01T17:01:44.153 回答
0

间歇性是指某些页面表现出这种行为而其他页面没有表现出这种行为,或者有些页面有时会表现出这种行为而有时不会表现出这种行为?

您是否可以将任何日志记录附加到 AJP 层以记录该级别的 HTTP 标头,以便您可以验证是 Apache 还是 Tomcat 添加了虚假标头?

于 2009-06-01T17:04:48.220 回答
0

您是否要代理回集群?也许其中一台服务器配置错误。

于 2009-06-01T23:33:59.307 回答
0

行。我想通了,这是servlet代码中的一个错误:

作为 HTTP 请求的结果,我们正在做这样的事情来编写序列化的 Java 对象:

DeflaterOutputStream dos = new DeflaterOutputStream(response.getOutputStream());
ObjectOutputStream oos = new ObjectOutputStream(dos);
response.setContentType("application/x-java-serialized-object");
oos.writeObject(someObject);

似乎正在发生的事情是,DeflaterOutputStreamObjectOutputStream它们仍然附加到响应对象的输出流时,它们会在三到四个请求之后被垃圾收集,这会导致流上发生一些事情,使 Apache 感到困惑并导致它重写标头.

我将上面的内容替换为:

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(byteStream);
oos = new ObjectOutputStream(dos);
response.setContentType("application/x-java-serialized-object");
oos.writeObject(someObject);
oos.flush();
dos.finish();
byteStream.writeTo(response.getOutputStream());

问题就消失了。

以下链接似乎描述了类似的问题:

于 2009-06-02T02:40:58.557 回答
0

I was also facing the same issue it got resolved. If problem in only one folder then there is some servlet that is blocking the request/response and making a customize request/response to tomcat. Tomcat 7.0.x

于 2012-05-10T10:55:18.320 回答