Apache错误地将jsp页面转换为“text / plain”

时间:2009-06-01 08:20:53

标签: apache tomcat ajp

我有一个相当正常的设置,其中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,则不会出现问题。

6 个答案:

答案 0 :(得分:5)

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

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

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/

答案 1 :(得分:0)

如果你间歇地看到这个问题,那几乎肯定是servlet代码中的某些内容,而不是Tomcat或httpd的错误配置。您是否有可以打开以记录HTTP标头内容的日志记录?

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

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

答案 2 :(得分:0)

间歇性的,你的意思是说某些页面表现出这种行为而其他页面没有表现出来,或者有些页面有时表现出这种行为,有时候却没有?

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

答案 3 :(得分:0)

您是否代理回到群集?可能其中一个服务器配置错误。

答案 4 :(得分: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());

问题已经消失。

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

答案 5 :(得分:0)

我也面临同样的问题。 如果只有一个文件夹出现问题,那么就会有一些servlet阻塞请求/响应并对tomcat进行自定义请求/响应。 Tomcat 7.0.x