【问题标题】:$c->req->base broken after upgrade to Catalyst 5.90$c->req->base 在升级到 Catalyst 5.90 后损坏
【发布时间】:2013-07-07 15:45:32
【问题描述】:

我们有一个旧的 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 之间存在某种损坏。但是我该去哪里呢?

【问题讨论】:

    标签: perl fastcgi lighttpd catalyst


    【解决方案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 标志来完成,但这对我不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 2016-09-14
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多