2013-07-09 60 views
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/ 

當我通過lighttpd的FastCGI的(不正確)運行相同的代碼:

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

答案似乎是催化劑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標誌內fastcgi.server在lighttpd的配置做了,但這並沒有工作爲了我。