徒然なるままに

個人の備忘録を中心としたブログです

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
apacheとtomcatをajpで連携した状態で、tomcat側の通常htmlファイルをアクセスする時にステータスコード304(Not Modified)で、何故かページが表示されないという現象が起こった。

この304というコード自身はページファイルのタイムスタンプを見てページに変更がないということで問題はないのだが・・・。
servletやjspファイルへは200(OK)となるのは、これらが動的にページを生成するものであるからだろう。

また、tomcat単独でのアクセス(8080ポート)時は304(Not Modified)でも正常にキャッシュを参照出来ている。
Apacheをリバースプロキシで通しているとうまくキャッシュが参照できていないようである。
そのため、ブラウザのキャッシュを消去して初めのアクセスは200(OK)でhtmlファイルの内容が表示される。
二回目以降は304で表示されない。

ちなみにCtrl+F5の更新を使えば、キャッシュを使わずにページを再取得するので、とりあえず表示したいならこれ。


・対策1、キャッシュを無効にする
(tomcatのキャッシュ対策)
context.xmlにて
にreloadable="true"オプションを追加して
とする。
しかしこれは、「Tomcatを再起動せずにサーブレットのクラスファイルを更新して反映させることができる」
というもののようでキャッシュを無効にするとはまた違った。実際挙動変わらず。

(htmlのキャッシュ対策)
同様にhtmlの<head>に
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

を記述しキャッシュを使わないようにする。が、結局これもブラウザによって挙動が変わったりする不安定なものでFirefox、Chromeでは304が帰って来てアウト。

(Apacheのキャッシュ対策)
mod_headersをDSOインストールして、キャッシュを抑制する。

インストール方法は
Apacheのソースからmodules/metadata/に入って、
sudo /usr/local/apache/bin/apxs -i -a -c mod_headers.c
apachectl -M

無事DSOインストールできると、headers_module (shared)が追加されています。

apacheとtomcatを再起動させてテスト。
無事、200(OK)が返ってきました。

・対策2、キャッシュのkeyとなるURLを変換する。
こっちが原因への直接的対策です。

tomcat(ディレクトリ)以下をtomcatに渡しているとします。
http://localhost/tomcat/hoge/hoge.htmlのページのキャッシュは当然、
key:http://localhost/tomcat/hoge/hoge.htmlで保存されるわけですが、
tomcat側でapacheは見えないので、http://localhost/hoge/hoge.htmlを探しにいっているというのが
原因として最も考えられます。

要するにCookieについて、ProxyPassReverseCookiePathでURLを書き換えたように
キャッシュでも同じようなことができないのかということです。

これに関しては情報を探してもなかなか出てきません。
キャッシュのURLキーの書き換えについて、知っている人がいましたら教えてください。


上記以外の対策法も募集しています。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://kamiyasu2.blog.fc2.com/tb.php/31-5eee692b

kamiyasu

Author:kamiyasu

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。