Apache错误地将jsp页面转换为;“纯文本/纯文本”;

Apache错误地将jsp页面转换为;“纯文本/纯文本”;,apache,tomcat,ajp,Apache,Tomcat,Ajp,我有一个相当正常的设置,Apache通过AJP协议代理对Tomcat内部运行的servlet的请求 我们已经在Apache2.0.46/Tomcat 5.0.28上运行了这个安装程序很多年了,没有出现问题,但是最近更新到了Apache2.2.3/Tomcat 5.5 问题是,我们已经注意到,Apache会间歇性地(可能在3中有一次)将servlet提供的页面的“内容类型”HTTP头从“text/html”转换为“text/plain”,这导致浏览器显示html源代码,而不是呈现它 以前有没有人见

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

我们已经在Apache2.0.46/Tomcat 5.0.28上运行了这个安装程序很多年了,没有出现问题,但是最近更新到了Apache2.2.3/Tomcat 5.5

问题是,我们已经注意到,Apache会间歇性地(可能在3中有一次)将servlet提供的页面的“内容类型”HTTP头从“text/html”转换为“text/plain”,这导致浏览器显示html源代码,而不是呈现它

以前有没有人见过这种行为,知道原因是什么?我怀疑我们在servlet代码中做了一些不好的事情,而旧版本的Tomcat/Apache更能原谅这些错误


更新:我已确认Apache正在更改标题。如果我直接浏览到Tomcat,问题就不会发生。

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

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


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

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

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


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

间歇性,你的意思是有些页面表现出这种行为而其他页面没有,还是有些页面有时表现出这种行为而有时没有


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

间歇性,您的意思是某些页面表现出这种行为而其他页面没有,还是有些页面有时表现出这种行为而有时没有


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

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

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

正常。我发现这是servlet代码中的一个bug:

我们是这样做的,以编写作为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());
问题已经解决了

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


    • 好的。我发现这是servlet代码中的一个bug:

      我们是这样做的,以编写作为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());
      
      问题已经解决了

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


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

      解决方案是为以下web应用向apache虚拟主机添加DefaultType None行:

      DefaultType None
      

      从我的博客帖子:

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

      解决方案是为以下web应用向apache虚拟主机添加DefaultType None行:

      DefaultType None
      

      从我的博客帖子:

      我也面临着同样的问题,它得到了解决。 如果只有一个文件夹出现问题,那么有一个servlet正在阻止请求/响应,并向tomcat发出定制请求/响应。
      Tomcat 7.0.x

      我也面临着它得到解决的同样问题。 如果只有一个文件夹出现问题,那么有一个servlet正在阻止请求/响应,并向tomcat发出定制请求/响应。
      Tomcat 7.0.x

      该问题似乎会影响应用程序中的任何页面。该问题似乎会影响应用程序中的任何页面。我有一台服务器正确提供了该类型,但另一台服务器以纯文本形式提供。将这一行代码添加到有问题的服务器上的vhost对我来说很有效。我有一台服务器正确提供了该类型,但另一台服务器以纯文本形式提供。将此代码行添加到服务器上的vhost,问题已解决