Catalyst, redirect и https

30 views
Skip to first unread message

Serg Gulko

unread,
Nov 11, 2011, 12:54:46 PM11/11/11
to Kiev Perl Users Group
Есть приложение на Catalyst, запущено под FastCGI, в качестве front-
end-а используется nginx.
При использовании $c->response->redirect($c->uri_for("/cool_place"));
backend всегда делает редикерк по http, в то время как на nginx-е у
нас поднят SSL.
Особенно неприятно это проявляется при операциях типа Logout, когда
пользователь явно был в защищенной зоне, послал запрос типа /logout,
который имел такой вот вид:

$c->log->info('Logout');
$c->logout;

$c->response->redirect($c->uri_for("/"));

и видит чуденсую ошибку.

Сейчас я решил этот вопрос явным указанием того, что схема у нас
https:

$c->log->info('Logout');
$c->logout;

my $uri = $c->req->base();
$uri->scheme("https");
$c->req->base($uri);

$c->response->redirect($c->uri_for("/"));

Но вот что-то мне подсказывает, что такой суровый хардкод не очень
красив. По странным причинам Catalyst::Plugin::RequireSSL тоже не
сильно помог.
Кто сталкивался с такой проблемой и знает как решить ее малой кровью?

Dmitrii

unread,
Nov 11, 2011, 3:41:27 PM11/11/11
to Serg Gulko, Kiev Perl Users Group

пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ:

пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ ajax пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ javascript, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ javascript'пїЅ

--- пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ ---
пїЅпїЅ пїЅпїЅпїЅпїЅ: "Serg Gulko" <s.g...@gmail.com>
пїЅпїЅпїЅпїЅ: "Kiev Perl Users Group" <kiev-perl-...@googlegroups.com>
пїЅпїЅпїЅпїЅ: 11 пїЅпїЅпїЅпїЅпїЅпїЅ 2011, 20:54:50
пїЅпїЅпїЅпїЅ: Catalyst, redirect пїЅ https


> пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ Catalyst, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ FastCGI, пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ front-
> end-пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ nginx.
> пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ $c->response->redirect($c->uri_for("/cool_place"));
> backend пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ http, пїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅ nginx-пїЅ пїЅ
> пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ SSL.
> пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ Logout, пїЅпїЅпїЅпїЅпїЅ
> пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ /logout,
> пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅ:


>
> $c->log->info('Logout');
> $c->logout;
>
> $c->response->redirect($c->uri_for("/"));
>

> пїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ.
>
> пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅ


> https:
>
> $c->log->info('Logout');
> $c->logout;
>
> my $uri = $c->req->base();
> $uri->scheme("https");
> $c->req->base($uri);
>
> $c->response->redirect($c->uri_for("/"));
>

> пїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅ-пїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ
> пїЅпїЅпїЅпїЅпїЅпїЅ. пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ Catalyst::Plugin::RequireSSL пїЅпїЅпїЅпїЅ пїЅпїЅ
> пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ.
> пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ

Serg V. Gulko

unread,
Nov 11, 2011, 4:25:06 PM11/11/11
to Dmitrii, Kiev Perl Users Group
Ну, у меня там достаточно много внутренних редиректов, которые не хотелось бы выносить на клиентскую сторону:)
В Птн, 11/11/2011 в 22:41 +0200, Dmitrii пишет:
можно сделать альтернативный вариант:

отправить ajax запрос на javascript, получить результат и сделать редирект на javascript'е



 --- Исходное сообщение ---
 От кого: "Serg Gulko" <s.g...@gmail.com>
 Кому: "Kiev Perl Users Group" <kiev-perl-...@googlegroups.com>
  Дата: 11 ноября 2011, 20:54:50
 Тема: Catalyst, redirect и https
 


> Есть приложение на Catalyst, запущено под FastCGI, в качестве front-
> end-а используется nginx.
> При использовании $c->response->redirect($c->uri_for("/cool_place"));
> backend всегда делает редикерк по http, в то время как на nginx-е у
> нас поднят SSL.
> Особенно неприятно это проявляется при операциях типа Logout, когда
> пользователь явно был в защищенной зоне, послал запрос типа /logout,
> который имел такой вот вид:
> 
> $c->log->info('Logout');
> $c->logout;
> 
> $c->response->redirect($c->uri_for("/"));
> 
> и видит чуденсую ошибку.
> 
> Сейчас я решил этот вопрос явным указанием того, что схема у нас
> https:
> 
> $c->log->info('Logout');
> $c->logout;
> 
> my $uri = $c->req->base();
> $uri->scheme("https");
> $c->req->base($uri);
> 
> $c->response->redirect($c->uri_for("/"));
> 
> Но вот что-то мне подсказывает, что такой суровый хардкод не очень
> красив. По странным причинам Catalyst::Plugin::RequireSSL тоже не
> сильно помог.
> Кто сталкивался с такой проблемой и знает как решить ее малой кровью?

und3f

unread,
Nov 11, 2011, 6:12:35 PM11/11/11
to kiev-perl-...@googlegroups.com
О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ fastcgi О©╫ nginx О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
fastcgi_param HTTPS on;

11.11.2011 19:54, Serg Gulko О©╫О©╫О©╫О©╫О©╫:
О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ Catalyst, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ FastCGI, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ front-
end-О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ nginx.
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ $c->response->redirect($c->uri_for("/cool_place"));
backend О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ http, О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ nginx-О©╫ О©╫
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ SSL.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ Logout, О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ /logout,
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫:

    $c->log->info('Logout');
    $c->logout;

    $c->response->redirect($c->uri_for("/"));

О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.

О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫
https:

    $c->log->info('Logout');
    $c->logout;

    my $uri = $c->req->base();
    $uri->scheme("https");
    $c->req->base($uri);

    $c->response->redirect($c->uri_for("/"));

О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ Catalyst::Plugin::RequireSSL О©╫О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫?

Serg V. Gulko

unread,
Nov 12, 2011, 5:02:22 AM11/12/11
to kiev-perl-...@googlegroups.com
Спасибо за ответ, все работает!
В Сбт, 12/11/2011 в 01:12 +0200, und3f пишет:
HTTPS on;
Reply all
Reply to author
Forward
0 new messages