1

私は、Apache が AJP プロトコルを介して Tomcat 内で実行されているサーブレットにリクエストをプロキシする、かなり通常の設定をしています。

このセットアップを Apache 2.0.46/Tomcat 5.0.28 で何年も問題なく実行してきましたが、最近 Apache 2.2.3/Tomcat 5.5 に更新しました。

問題は、断続的に (おそらく 3 回に 1 回) Apache がサーブレットによって提供されるページの「Content-Type」HTTP ヘッダーを「text/html」から「text/plain」に変換することに気付いたことです。 HTML ソースをレンダリングする代わりに表示するブラウザになります。

この種の動作を以前に見たことがあり、何が原因であるかを知っている人はいますか? 古いバージョンの Tomcat/Apache では許容されていたサーブレット コードで何か悪いことをしているのではないかと思います。

更新: Apache がヘッダーを変更していることを確認しました。Tomcat を直接参照すると、問題は発生しません。

4

6 に答える 6

6

一部の 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/

于 2011-12-01T00:32:57.330 に答える
0

私もそれが解決されたのと同じ問題に直面していました。1つのフォルダだけに問題がある場合は、リクエスト/レスポンスをブロックし、Tomcatへのカスタマイズリクエスト/レスポンスを作成しているサーブレットがあります。Tomcat 7.0.x

于 2012-05-10T10:55:18.320 に答える
0

この問題が断続的に発生する場合は、Tomcat または httpd の設定ミスではなく、サーブレット コードに問題があることはほぼ確実です。HTTP ヘッダーの内容を出力するためにオンにできるロギングはありますか?

問題をもう少し切り分けるには、httpd をバイパスして、ページの Tomcat URL に直接アクセスすることもできます。

この特定の動作を自分で見たことがないので、申し訳ありませんが、これ以上具体的に言えません。

于 2009-06-01T17:01:44.153 に答える
0

断続的とは、一部のページでこの動作が見られ、他のページでは見られないということですか? または、この動作が見られるページとそうでないページがあるということですか?

そのレベルで HTTP ヘッダーをログに記録するために AJP レイヤーにログを添付して、偽のヘッダーを追加するのが Apache か Tomcat かを確認できますか?

于 2009-06-01T17:04:48.220 に答える
0

クラスターに戻ってプロキシしていますか? サーバーの 1 つが正しく構成されていない可能性があります。

于 2009-06-01T23:33:59.307 に答える
0

Ok。私はそれを理解しました、それはサーブレットコードのバグでした:

HTTP リクエストの結果としてシリアライズされた Java オブジェクトを書き込むために、次のようなことを行っていました。

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

発生しているように見えたのは、応答オブジェクトの出力ストリームに接続されたままの 3 つまたは 4 つの要求の後で、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());

そして問題はなくなりました。

次のリンクは、同様の問題を説明しているようです。

于 2009-06-02T02:40:58.557 に答える