升级到Catalyst 5.90后,$ c-> req->基本损坏

时间:2013-07-09 21:13:53

标签: perl fastcgi lighttpd catalyst

我们有一个旧的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/

当我使用FastCGI(不正确)通过lighttpd运行相同的代码时:

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

我正在使用Debian wheezy的Catalyst 5.90015-1。我尝试升级到最新版本,但是一些依赖项需要更新版本的perl。此外,Changelog似乎没有提及任何(显然)相关的uri_for修复。

因此我假设lighttpd和Catalyst之间存在某种破坏。但是我从哪里开始呢?

1 个答案:

答案 0 :(得分:1)

答案似乎是Catalyst 5.9不再对lighttpd传递的环境变量进行必要的修复。可以使用Plack::Middleware/LighttpdScriptNameFix模块重新启用此功能。

我通过添加:

完成了这项工作
use Catalyst qw/
.
.
            EnableMiddleware
    /;
use Plack::Middleware::LighttpdScriptNameFix;
.
.
__PACKAGE__->config(
    'Plugin::EnableMiddleware' => [
        'LighttpdScriptNameFix',
    ],
);

据称,使用lighttpd 1.4.23或更高版本,这也可以通过在lighttpd配置中启用fastcgi.server中的fix-root-scriptname标志来完成,但这对我不起作用。