我们有一个旧的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之间存在某种破坏。但是我从哪里开始呢?
答案 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
标志来完成,但这对我不起作用。