[Moscow.pm] nginx + Catalyst + PSGI

iSage isage на aumi.ru
Пт Сен 30 00:34:06 PDT 2011


Иногда очень полезно заглядывать в исходники того, что вы используете.
Plack::Middleware::ReverseProxy:

$env->{HTTPS} = $env->{'HTTP_X_FORWARDED_HTTPS'}
        if $env->{'HTTP_X_FORWARDED_HTTPS'};
    $env->{HTTPS} = 'ON'
        if $env->{'HTTP_X_FORWARDED_PROTO'} &&
$env->{'HTTP_X_FORWARDED_PROTO'} eq 'https';    # Pound
    $env->{'psgi.url_scheme'}  = 'https' if $env->{HTTPS} && uc
$env->{HTTPS} eq 'ON';
    my $default_port = $env->{'psgi.url_scheme'} eq 'https' ? 443 : 80;




On Fri, 30 Sep 2011 11:21:42 +0400, Иван Соколов <vaneska.ru на gmail.com>
wrote:
> Добрый день!
> 
> Схема такая
> frontend - nginx
> backend - plackup -s Starman app.psgi --port 3000
> 
> Решить проблему с X-Real-IP удалость очень просто с помощью
> Plack::Middleware::ReverseProxy
> Но есть другая проблема.
> Т.к. передается http запрос на backend, $c->request->base выдает схему http
> и некоторые модули типа Catalyst::Controller::FormBuilder в form
> action="" кладут http url.
> Временно решил это так:
> builder {
>     enable_if { $_[0]->{REMOTE_ADDR} eq '127.0.0.1' }
>         "Plack::Middleware::ReverseProxy";
>      enable sub {
>          my $app = shift;
>          sub {
>              my $env = shift;
>              $env->{'psgi.url_scheme'} = 'https' if
> $env->{HTTP_X_IS_SECURE} || $env->{HTTPS};
>              $app->($env);
>          }
>      };
>     $app;
> };
> 
> Может есть какое-то более правильное решение?
> 
> -- 
> С уважением,
> Иван



Подробная информация о списке рассылки Moscow-pm