すでに構築したものの追加要望で、あるサイトからPOSTされたBODYの中から特定の項目を抽出してCookieに埋め込んでほしいというものがあり、その方法を模索して今回の件名にたどり着きました。
前提事項
- Apache 2.2のモジュールを使って実現できること(できるだけ)
- ApacheのBackendにあるアプリケーションサーバには変更を加えない
- FormでPOSTされた情報から抽出し、Keyは柔軟に変更できなければならない
考えたこと
当初はApacheのmod_rewriteで下記のようにできないかとか考えてたんだけど(渡される値がURLにあると勘違いしてた)、ちょっと調べた限りではそれは難しそうだと断念。少なくともBODYの中身まで見てCookieに埋め込むようなことはできないなぁと。
RewriteEngine On
RewriteRule "^/index\.html\?KEY=(.+)" "-" [CO=key:$1:1440:/]
で、ちょっと前にngx_mrubyを弄ったことがあって、そういえばApache版もあったことを思い出し、実際にやってみた結果うまくいったのでその内容を下記に記載します。
導入手順
mod_mrubyのページに書いてあるとおりDocker使えば楽なのですが、今回はすでに構築されているApacheに対して適用しなければならないので、Dockerでない方法で確認します。基本的に記載のとおりにやれば問題なくインストールできます。
なお、依存モジュールがあるので、その点のみ注意です。
sudo apt-get install openssh-server git curl apache2 apache2-dev apache2-utils rake ruby2.0 ruby2.0-dev bison libcurl4-openssl-dev libhiredis-dev libmarkdown2-dev libcap-dev libcgroup-dev
設定内容
下記設定で確認しました。 mrubyInsertFilterFirst
を使っていますが、ほかのDirectiveでも動作するかもしれません。また、r.filename
を使ってリダイレクトもしています。
<VirtualHost>
〜略〜
<Location /login/>
mrubyInsertFilterFirst /path/to/mruby/set-cookie.rb
</Location>
〜略〜
</VirtualHost>
r = Apache::Request.new
s = Apache::Server.new
hout = Apache::Headers_out.new
if r.body.to_s =~ /KEY=(.+)/
hout["Set-Cookie"] = "key=#{$1}; path=/; expires=EXPIRATION_DATE"
end
r.filename = s.document_root + "REDIRECT"
Apache.return(Apache::OK)
<form method="POST" action="http://TARGET_SERVER/login/">
<input type="text" name="KEY" value="VALUE" />
<input type="submit"/>
</form>
ChromeのデベロッパーツールでCookieがセットされていること確認できました。
使ってみて
mod_mrubyはかゆいところに手が届く、すばらしいソフトウェアです。他にもいろいろカバーしている機能があり、もっともっと活用できそうです。この場を借りて、mruby、mod_mrubyを開発されたみなさま(特にまつもとさんと松本さん)に感謝いたします。いやぁ、ほんと助かりました。
注意
動作は確認していますが、保証するものではありません。実際お試しになる場合は正しく動作しない可能性もありますので、ご留意ください。
内容で間違っている部分等ありましたらご指摘いただけるとうれしいです。
参考にさせていただいたサイト
その他いろいろなサイトを徘徊して調べました。Apache, mod_mrubyについて情報を公開してくださっているみなさまに感謝です。