Mojoliciousでhttps(SSL)専用ページとhttp専用ページの振り分けをroutesのbridgeを使って行う
- 2013.04.29
- Mojolicious
- Mojolicious, perl
webアプリを作る上でセキュアな通信を強要するページとそうではないページを振り分けるにはどうすればいいのか悩んでいたのだけど、ルーターでリダイレクトさせる方法にしてみた。
全てのページをSSLでアクセスされても速度的にとか負荷的に困るので、ある決まったrouteのみSSLでアクセスして、メインのコンテンツは通常のhttp通信(非SSL)にredirectする仕様。
必ずhttpsでアクセスするルート
- /login
- /join
必ずhttpでアクセスするルート
- /
- /entry/1
- /entry/2
- /entry/....
httpでもhttpsでもいいルート
- /mypage
- /favorite/list/1
例ではログインページや登録ページではセキュアな通信をして、トップページとエントリーページは普通のhttpで通信する。httpsでもhttpでもどちらでもいいページは最後の Any routes の所で振り分けられる。
sub startup {
$self = shift;
....
# Routes
my $routes = $self->routes;
# SSL onry routes
my $ssl_rotes = $routes->bridge->to(
cb => sub{
my $self = shift;
my $req = $self->req;
return 1 if $req->is_secure;
$self->redirect_to($req->url->to_abs->scheme('https'));
return;
}
);
# スッキリ書くならこんな感じ?
# my $ssl_rotes = $routes->bridge->to(
# cb => sub{
# return 1 if $_[0]->req->is_secure;
# $_[0]->redirect_to($_[0]->req->url->to_abs->scheme('https'));
# return;
# }
# );
# Not SSL routes
my $not_ssl_routes = $routes->bridge->to(
cb => sub{
my $self = shift;
my $url = $self->req->url;
return 1 if $url->base->scheme eq 'http';
$self->redirect_to($url->to_abs->scheme('http'));
return;
}
);
# SSL onry route
$ssl_rotes->route('/login')->to('login#index');
$ssl_rotes->route('/join')->to('join#index');
# not SSL routes
$not_ssl_routes->route('/')->to('top#index');
$not_ssl_routes->route('/entry/:id', id => qr/\d+/)->to('entry#index', id => 1 );
# Any Routes
$routes->route('/:controller')->to(action => 'index');
$routes->route('/:controller/:action')->to();
$routes->route('/:controller/:action/:id')->to();
}
考えついたのはこんな感じのコードだけど、もっといい方法があるかもしれません。知っている方いたら教えて下さい!
-
前の記事
[Postfix+MySQL][CentOS] yumでSpamAssassinを導入 2013.04.28
-
次の記事
[WordPress] いろいろなソーシャルボタンを簡単に設置できるプラグイン WP Social Bookmarking Lightを好きな位置に表示する 2013.05.05