База $c-›req-› не работает после обновления до Catalyst 5.90

У нас есть старое приложение Catalyst, первоначально разработанное для Catalyst 5.7, а затем обновленное до Catalyst 5.8 пару лет назад.

Теперь мы пытаемся обновиться до Catalyst 5.9, и теперь вызовы $c->uri_for() не дают разумных результатов, но только при запуске из lighttpd, а не при запуске с автономного сервера отладки.

Я удалил все контроллеры приложений, кроме Root.pm, и превратил их в один саб:

package DCWeb::Controller::Root;

use strict;
use warnings;
use 5.10.0;
use Moose;
use namespace::autoclean;

BEGIN { extends 'Catalyst::Controller' }

__PACKAGE__->config->{namespace} = '';

sub foo :Path {
    my ( $self, $c ) = @_;
    $c->log->debug("Base: ".$c->req->base);
}

1;

Когда я запускаю код с автономного сервера отладки, я получаю следующий вывод отладки (правильно):

Jul  9 15:09:51 dc8 dc-web: Base: http://localhost:3000/

Когда я запускаю тот же код через lighttpd с FastCGI (неверно):

Jul  9 15:10:25 dc8 dc-web: Base: http://localhost:8080/foo/

Я использую Catalyst 5.90015-1 от Debian wheezy. Я попытался обновиться до последней версии, но для некоторых зависимостей требовалась более новая версия perl. Кроме того, журнал изменений, по-видимому, не упоминает никаких (очевидно, ) соответствующие исправления uri_for.

Поэтому я предполагаю, что между lighttpd и Catalyst есть какая-то поломка. Но куда мне идти отсюда?


person Flimzy    schedule 09.07.2013    source источник


Ответы (1)


Ответ, по-видимому, заключается в том, что Catalyst 5.9 больше не выполняет необходимой фиксации переменных среды, передаваемых lighttpd. Это можно повторно включить с помощью http://search.cpan.org/~miyagawa/Plack-1.0028/lib/Plack/Middleware/LighttpdScriptNameFix.pm.

Я достиг этого, добавив:

use Catalyst qw/
.
.
            EnableMiddleware
    /;
use Plack::Middleware::LighttpdScriptNameFix;
.
.
__PACKAGE__->config(
    'Plugin::EnableMiddleware' => [
        'LighttpdScriptNameFix',
    ],
);

Якобы с lighttpd 1.4.23 или новее это тоже можно сделать, включив флаг fix-root-scriptname внутри fastcgi.server в конфиге lighttpd, но у меня это не сработало.

person Flimzy    schedule 09.07.2013