催化剂一致的url格式与尾部斜线

时间:2013-02-06 23:10:09

标签: perl url catalyst trailing-slash

我正在开发Catalyst应用程序并且遇到Catalyst解释网址的问题。

让我们说在我们的Catalyst应用程序中,我们有一个控制器Account。如果是这种情况,Catalyst将解释

  

http://mydomain.com/accounthttp://mydomain.com/account/

作为索引操作的相同网址。

然而,对于搜索引擎优化和链接目的(并且只是为了保持整体)我想强制Catalyst只识别一种格式并坚持下去。

我找到了一个似乎是为此构建的模块:Catalyst::Plugin::SanitizeUrl,它的文档说你应该放

  

使用Catalyst' SanitizeUrl';

myapp.pm中的

,这将为您处理一切。

但是,每当我使用它时,我只会得到错误:

Bad request

在每个页面加载。有没有人知道让Catalyst只使用一种格式的简单方法?

3 个答案:

答案 0 :(得分:1)

强制Catalyst只使用一种格式而不使用斜杠的简单方法是将此方法添加到MyApp.pm:

sub begin :Private {
    my ($self, $c) = @_;
    my @path = split "/", $c->req->path, -1;
    $c->detach('default') if @path and (pop @path eq '');
}

如果uri以任何请求的斜杠结尾,它将重定向'default'方法a.k.a页面404。

答案 1 :(得分:0)

我猜你可以将url转发到不同的动作方法,具体取决于是否存在尾随/。 所以,

sub index :Path :Args(0) { 
    my ($self,$c) = @_;
    my $path = $c->request->path;
    my $matched = $path =~ s/(\/)$//;
    if ($matched) {
          $c->forward('withslash');
    }
    else {
          $c->forward('withoutslash');
    }
}

这是一个未经验证的解决方案,您可能需要检查它。

答案 2 :(得分:0)

我最终将edem所说的与我所做的一些事情结合起来,这是我的最终结果:

sub begin :Private {
    my ($self, $c) = @_;

    #don't allow trailing slashes!
    my @path = split "/", $c->req->path, -1;
    if(@path and (pop @path eq '')) {
        my $p = join '/', @path;
        #set as moved permanently
        $c->res->redirect("/$p", 301);
        return;
    }
}

如果请求结尾处有一个尾部斜杠,它将始终重定向到相同的网址但没有斜杠。