我有一个相当正常的设置,其中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,则不会出现问题。
答案 0 :(得分:5)
某些网络应用程序没有正确设置它们所服务的mime类型的内容,但在独立服务时仍然可以正常工作,因为浏览器等客户端应用程序能够解释内容的类型。但是当在Apache之后服务时,这些应用程序将无法正常运行,因为Apache将提供默认类型的text / plain。
解决方案是为这些Web应用程序的apache虚拟主机添加DefaultType None行:
DefaultType None
答案 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);
似乎正在发生的事情是,当DeflaterOutputStream
和ObjectOutputStream
仍然附加到响应对象的输出流时,它会被垃圾收集三或四个请求,这会导致某些事情发生在困扰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