Javaコンテナでは、Cookieが機能しないUserAgentではjsessionidをURL(HTML内のURL全て)に自動付与してSESSIONを保つようにするが、次のような問題がある。
・検索エンジンにjsessionidもろともインデックスされてしまう。
・画像などの静的コンテンツをJavaコンテナ以外(フロントのWebサーバなど)に配置した場合、jsessionidがジャマをしてGETできない。
(Cookie対応ブラウザでも、初回アクセス時には付与されて同じ問題が発生)
これらの問題を除去するのに、Url Rewrite Filterを使う。
http://www.tuckey.org/urlrewrite/
Lift2.0+Jetty6でも普通に利用できた。
■WEB-INF/web.xml
<web-app>
<filter>
<filter-name>LiftFilter</filter-name>
<filter-class>net.liftweb.http.LiftFilter</filter-class>
</filter>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LiftFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
■WEB-INF/urlrewrite.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<!-- 検索エンジンにjsessionidをインデックスさせない-->
<outbound-rule enabled="true" encodefirst="true">
<condition name="user-agent">Googlebot.*</condition>
<from>(.*);jsessionid=[0-9A-Za-z]+</from>
<to>$1</to>
</outbound-rule>
<outbound-rule enabled="true" encodefirst="true">
<condition name="user-agent">Mediapartners-Google</condition>
<from>(.*);jsessionid=[0-9A-Za-z]+</from>
<to>$1</to>
</outbound-rule>
<outbound-rule enabled="true" encodefirst="true">
<condition name="user-agent">Adsbot-Google</condition>
<from>(.*);jsessionid=[0-9A-Za-z]+</from>
<to>$1</to>
</outbound-rule>
<!-- 画像ファイルからjsessionidを除去 -->
<outbound-rule enabled="true" encodefirst="true">
<from>(.*[png|gif|jpg]);jsessionid=[0-9A-Za-z]+</from>
<to>$1</to>
</outbound-rule>
</urlrewrite>
Url Rewrite Filterは本来、RewriteEngineのJavaポートなので、RewriteEngineでできることは大体できる。バージョン3.2では、urlrewrite.xmlではなく、WEB-INF/.htaccess を記述しても動作するようだ(未検証)。
意外と便利かもと思ったのは、3.2の機能で、ある条件のときにRequest Attributeを追加できたりする。
<rule>
<condition name="user-agent">Mozilla/[1-4]</condition>
<set type="request" name="browser">Mozilla</set>
</rule>
request.getAttribute("browser") // => "Mozilla"
URL関係で困ったことがあったらURL Rewrite Filterは便利。
ただ、jsessionidの付与ルールくらいはコンテナで制御できるようにして欲しいなっ