なんじゃくにっき

プログラミングの話題中心。

play framework 1.2.x アクションチェーンでhttpsからhttpに移動してしまう問題

2chのplayスレ
http://kohada.2ch.net/test/read.cgi/php/1304277057/
で気になったことがあったので。
 


175 :nobodyさん:2012/07/12(木) 22:07:19.89 ID:???
誰か見てるかな(´・ω・`)ボスケテ
ttps://hello-chapati.dotcloud.com/hello.war/


困ってる事
 ■アクションチェーンをするとhttpsのアドレスからhttpのアドレスに遷移してしまう。

環境 Play Framework 1.2.3 ※1.2.4〜1.2.5でも同様
0.https://hello-chapati.dotcloud.com/hello.war/にアクセスする。
1.Application.indexアクションで入力画面が表示される。
2.登録ボタンを押すとApplication.registUserアクションにPOSTする。
3.Application.registUserアクションで処理が終わると、
  Application.indexアクションへリダイレクト(アクションチェーン)する。
4.入力画面に戻ってくる。
  この時なぜかURLがhttp://hello-chapati.dotcloud.com/hello.war/になってしまう。

■条件
・dotcloud上で動かした場合。
・Apache2にSSLの設定をしてPlayと連携させた場合。

※PlayのアプリにSSLの設定をしてhttpsにアクセスした場合は、アクションチェーンをさせてもhttpsのままです。

 
QA@ITにも投稿してるみたいだけど、このエントリ書いてる時点で回答が付いていない・・
http://qa.atmarkit.co.jp/q/2275
 
 
 
で、まず前提条件として、
playに限らずjavaのWEBアプリ(javaじゃなくてもいいんだけど)をWEBサーバー(apache, lihttpd, nginx等)と連携させる場合の設定が以下のようなものとする
 
・WEBサーバー(以下【web】)はエンドユーザー(以下【client】)からの
 リクエストを80番(http)と443番(https)で待ち受ける
・reverse-proxyの設定で【web】は【client】からのリクエストを
 WEBアプリ(以下【app】)に受け流す
 【app】は【web】からのリクエストを9000番(http)で待ち受ける
 
この場合、【client】からのリクエストがあった場合、それがhttpだろうとhttpsだろうと【app】<->【web】間の通信はhttp なことに注意
 
ここで最初の問題に立ち返る。
playのアクションチェーンはどうも
『元々のプロトコル』と同じプロトコルでリダイレクトする
という動きになっているぽい(ちゃんとソース追ってないので嘘付いてたらすいません)
 
だが、ここで『元々のプロトコル』というのはあくまでplay(【app】)から見た話。
【client】<->【web】間の通信がhttpsであろうとも、
【web】<->【app】間の通信が常にhttpなため、
【app】からは『元々のプロトコル』はhttpと見えるため、
httpにリダイレクトしてしまう。
 
これが多分原因(超推測)。
 
 
 
で、解決策をいくつか
 
■解決策1
アクションチェーンをやめて絶対パスでのリダイレクトにする。
この際、【client】<->【web】間のプロトコルを【app】でも知りたければ、
【web】の設定をする必要がある
(【client】からhttpsでアクセスされたら【app】に投げるhttpヘッダに何か追加する等)。

■解決策2
【web】の設定で特定のパスへのアクセスはhttps限定にする。
httpでアクセスされたらhttpsへリダイレクト。
この方法はそのパスがhttpでもhttpsでもアクセスできるようにする場合には使えない。
 
■解決策3
【app】の設定で特定のパスへのアクセスはhttps限定にする。
解決策2と問題点等は同じようなもん。
 
■解決策4
play本体のソースをいじってアクションチェーンの仕組みをいじって、
元々の【client】<->【web】間のプロトコルと同じプロトコルにリダイレクトするようにする。
 
 
 
 
自分でも読みにくい・・
図があったほうがわかりやすいかも・・?
でもかくのめんどい