【问题标题】:Apache is incorrectly converting jsp pages to "text/plain"Apache 错误地将 jsp 页面转换为“文本/纯文本”
【发布时间】:2023-03-08 00:58:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: apache tomcat ajp


    【解决方案1】:

    我也遇到了同样的问题,它已经解决了。 如果仅在一个文件夹中出现问题,那么有一些 servlet 会阻止请求/响应并对 tomcat 进行自定义请求/响应。 Tomcat 7.0.x

    【讨论】:

      【解决方案2】:

      一些 web 应用程序没有正确设置它们所提供的内容的 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/

      【讨论】:

      • 我有一台服务器正确提供了该类型,但另一台服务器以纯文本形式通过。将这行代码添加到有问题的服务器上的虚拟主机对我有用。
      【解决方案3】:

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

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

      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());
      

      问题就解决了。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          间歇性是指一些页面表现出这种行为而另一些没有,或者有些页面有时表现出这种行为而有时没有?

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

          【讨论】:

          • 这个问题似乎影响了应用中的任何页面。
          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-10-01
            • 1970-01-01
            • 2012-04-12
            • 2014-09-08
            • 1970-01-01
            • 2013-11-27
            • 2020-08-27
            • 2010-11-06
            • 1970-01-01
            相关资源
            最近更新 更多