Url Rewrite Filter

Url Rewrite Filterを使ってjsessionidの付与を細かく調整する方法。いつも使い方を忘れてしまうのでメモ。

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の付与ルールくらいはコンテナで制御できるようにして欲しいなっ


コメント
pomu0325
2010/12/31
Lift2.2からデフォルトではjsessionid付かなくなりました。意図的に付けたい場合はLiftRules.encodeJSessionIdInUrl_? = trueで。
武田ソフト
2011/01/03
情報ありがとうございます!

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: