狠狠撸

狠狠撸Share a Scribd company logo
UrlRewriteFilterに
手を入れてみた
福原和朗
2013-11-16

1
自己紹介
? 福原和朗
– @kazurof

? 客先常駐で開発やってます
? Webサービス
? Android, iPhone アプリ (Titanium Alloy)

? アクシオヘリックス(株)
– http://www.axiohelix.com/
? 開発案件あれば、ご連絡ください。
? エンジニア募集しています。
2
UrlRewriteFilter
? リクエストのURLを書き換えるライブラリ
– 外向きには綺麗なURLを提示し、内部ではフレー
ムワーク標準に合うURLが使えるようにする。
– http://tuckey.org/urlrewrite/
http://example.org/repo/data/123/なんとかかんとか

http://example.org/repo/data/get.do&id=123
3
事の発端
? 利用者から障害報告が来ました。
– バージョン3系から4系に上げた後。
利用者からのメール引用

以下をダウンロードしようとしたところ
ページにアクセスできません
とエラーとなりました。ご確認いただけますと幸いです。
http://example.org/download/data1234/link/datafile.xls

4
3系と4系の違い
? URL変換の指定と実際の動作を調べてみた。
実際に変換の指定をしているところ

<to>/file/download.action?workId=$1&amp;fileTyp
e=${escape:$2}&amp;fileName=${escape:$3}&amp
;originalUrl=%{request-url}</to>

? ${...} の部分の括弧対応がおかしい。
– それぞれ処理されるべきだが全体で一括で処理
されている。
5
${...} とは何か
? 関数
– ${<関数名>:<引数>:...} というような形
– escape , replaceなど色々
${upper:hello}

HELLO

${trim:

nantoka

nantoka }

http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#functions
6
関数が複数あるとき
? 関数の連続はNG
"a${upper:hoge} ${lower:fOObAR} b "
"aHOGER} ${LOWER:FOOBAR b"
この部分が無視される

? 関数の入れ子はOK
"a${trim:AbCd ${lower:fOObAR} 1234 } b "
"aAbCd foobar 1234 b“

7
既にissue listに上がってました
https://code.google.com/p/urlrewritefilter/issues/detail?id=120

関数が連続してるとNGだよ、と。
3.2.0では問題なかったと。

8
上がってはいますけど
? いつ解決されるかはわからない。
– なるべくなら最新版のものを早く使いたい。

? 必要な物は自分でつくるべき

直してみることにしました。
9
修正してみよう
? 現在の挙動を調べてみた
関数の開始と終了を正規表現で識別
"a${trim:AbCd ${lower:fOObAR} 1234 } b "
引数の部分を再帰的に処理
関数がないか識別
AbCd ${lower:fOObAR} 1234
10
やりたいこと
? 関数が続いていても入れ子でも動作すること
"a${upper:hoge} ${lower:fOObAR} b "
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

? 設定を木構造として解釈できればよい。
11
木構造として解釈
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

‘b ’

関数

‘a’

関数パラメータ

関数名 ‘trim’

‘AbCd ’

関数名 ‘lower’

関数

‘ 1234 ’

関数パラメータ
‘fOObAR’

12
Interpreterパターン
http://www.hyuki.com/dp/cat_Interpreter.html

13
新しいやり方の概略
? 変換先パターンをツリー構造へ解析
– 関数とか文字列そのものがノード
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

? それぞれのノードから処理結果を取得する。

14
必要なもの
? 文法規則
– 拡張BNFの形式
– 解釈の仕様

? 入力を切り分けるクラス
– トークン化する

? それぞれのノードを表す
クラス。
– 処理結果取得メソッド付き
15
拡張BNF
<tovalue> :== <element> *
<element> :== <value> | <function>
<value> :== any string
<function> :== ${ <functionContent> }
<functionContent> :== <functionName> : <param>
<param> :== <element> * | <element> * : <param>
<functionName> :== replace | replaceAll | replaceFirst | escape | escapePath | lower |
upper | toLower | toUpper | trim | length

${ , } , : が、文法上意味を持つ。これ重要!!
16
トークン化クラス
? ${ } : を基準に文字列を切り分ける。
a${trim:AbCd ${lower:fOObAR} 1234 } b

a

${

trim

:

AbCd

${

lower

:

fOObAR

}

1234

}

b

17
ノードを表すクラス
例:関数の中身を表現するBNFとそれを表すクラス
<functionContent> :== <functionName> : <param>

public class FunctionContentNode implements Node {
private FunctionNameNode funcNameNode;
private ParamNode paramNode;
public void parse(Context context) throws ParseException {
funcNameNode = new FunctionNameNode();
funcNameNode.parse(context);
context.skipToken(“:”);
paramNode = new ParamNode();
paramNode.parse(context);
}

18
Interpreterをやってみた印象
? それぞれの役割がはっきりしている
– トークナイザはただ区切って出すだけ。
– 各々のノードが各々の構文チェックのみを行う。
? 別の構文については何もしない。

19
(とりあえず)完成!
? 実サービスで現在稼働しています。
? パッチを本家に送ってみました。
– マージされれば御の字
https://code.google.com/p/urlrewritefilter/issues/detail?id=120#c4

? ビルド済みjarファイル公開しています。
http://www7b.biglobe.ne.jp/~archer/urlrewritefilter/issue120.html

20
まとめ
? 同じ問題に遭遇された方はどうぞ使ってみて
下さい。
– OSSのおかげで自己解決&他者へ貢献出来ました。

? Interpreterの練習が出来ました。
– 実業務ではやったことは無かった。
– プログラミングは実際に書いて動かすのが重要。

21
ご清聴ありがとうございました。

22
Ad

Recommended

自作アプリを Apple Watch対応した話 ?FastCheckin編?
自作アプリを Apple Watch対応した話 ?FastCheckin編?
Kosuke Ogawa
?
础苍诲谤辞颈诲で使える闯厂翱狈-闯补惫补ライブラリ
础苍诲谤辞颈诲で使える闯厂翱狈-闯补惫补ライブラリ
Yukiya Nakagawa
?
まだ残っていた础濒濒辞测地雷原始末记
まだ残っていた础濒濒辞测地雷原始末记
Kazuro Fukuhara
?
形式手法と补濒濒辞测の绍介
形式手法と补濒濒辞测の绍介
Daisuke Tanaka
?
Tracing Microservices with Zipkin
Tracing Microservices with Zipkin
takezoe
?
トーナメントは运か実力か
トーナメントは运か実力か
Kazuro Fukuhara
?
nextProbablePrime() について
nextProbablePrime() について
Kazuro Fukuhara
?
素数のハニカム螺旋
素数のハニカム螺旋
Kazuro Fukuhara
?
日本语による闯鲍苍颈迟の拡张について
日本语による闯鲍苍颈迟の拡张について
Kazuro Fukuhara
?
まだまだ踏み足りない础濒濒辞测地雷原始末记
まだまだ踏み足りない础濒濒辞测地雷原始末记
Kazuro Fukuhara
?
初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案
Kazuro Fukuhara
?
罢颈迟补苍颈耻尘初心者による础濒濒辞测地雷原始末记
罢颈迟补苍颈耻尘初心者による础濒濒辞测地雷原始末记
Kazuro Fukuhara
?
翱奥尝で何が言えるか
翱奥尝で何が言えるか
Kazuro Fukuhara
?
资格四方山话
资格四方山话
Kazuro Fukuhara
?
记述论理の解釈を见て思ったこと
记述论理の解釈を见て思ったこと
Kazuro Fukuhara
?
翱奥尝で何が书けるか
翱奥尝で何が书けるか
Kazuro Fukuhara
?
Protect Your IoT Data with UbiBot's Private Platform.pptx
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP Nagoya
?
色について.pptx .
色について.pptx .
iPride Co., Ltd.
?
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
Takuma Oda
?
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?

More Related Content

More from Kazuro Fukuhara (8)

日本语による闯鲍苍颈迟の拡张について
日本语による闯鲍苍颈迟の拡张について
Kazuro Fukuhara
?
まだまだ踏み足りない础濒濒辞测地雷原始末记
まだまだ踏み足りない础濒濒辞测地雷原始末记
Kazuro Fukuhara
?
初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案
Kazuro Fukuhara
?
罢颈迟补苍颈耻尘初心者による础濒濒辞测地雷原始末记
罢颈迟补苍颈耻尘初心者による础濒濒辞测地雷原始末记
Kazuro Fukuhara
?
翱奥尝で何が言えるか
翱奥尝で何が言えるか
Kazuro Fukuhara
?
资格四方山话
资格四方山话
Kazuro Fukuhara
?
记述论理の解釈を见て思ったこと
记述论理の解釈を见て思ったこと
Kazuro Fukuhara
?
翱奥尝で何が书けるか
翱奥尝で何が书けるか
Kazuro Fukuhara
?
日本语による闯鲍苍颈迟の拡张について
日本语による闯鲍苍颈迟の拡张について
Kazuro Fukuhara
?
まだまだ踏み足りない础濒濒辞测地雷原始末记
まだまだ踏み足りない础濒濒辞测地雷原始末记
Kazuro Fukuhara
?
初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案
Kazuro Fukuhara
?
罢颈迟补苍颈耻尘初心者による础濒濒辞测地雷原始末记
罢颈迟补苍颈耻尘初心者による础濒濒辞测地雷原始末记
Kazuro Fukuhara
?
翱奥尝で何が言えるか
翱奥尝で何が言えるか
Kazuro Fukuhara
?
记述论理の解釈を见て思ったこと
记述论理の解釈を见て思ったこと
Kazuro Fukuhara
?
翱奥尝で何が书けるか
翱奥尝で何が书けるか
Kazuro Fukuhara
?

Recently uploaded (8)

Protect Your IoT Data with UbiBot's Private Platform.pptx
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP Nagoya
?
色について.pptx .
色について.pptx .
iPride Co., Ltd.
?
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
Takuma Oda
?
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
Protect Your IoT Data with UbiBot's Private Platform.pptx
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP Nagoya
?
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
Takuma Oda
?
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
Ad

鲍谤濒搁别飞谤颈迟别贵颈濒迟别谤に手を入れてみた