1

我们有一个旧的 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。此外,变更日志似乎没有提到任何(显然)相关的 uri_for 修复。

因此,我假设 lighttpd 和 Catalyst 之间存在某种破坏。但我从这里去哪里?

4

1 回答 1

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 或更高版本,这也可以通过fix-root-scriptname在 lighttpd 配置中启用 fastcgi.server 中的标志来完成,但这对我不起作用。

于 2013-07-09T22:37:57.433 回答