2

我正在开发一个CatalystCatalyst应用程序,但在解释 url 的方式上遇到了麻烦。

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

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

作为索引操作的相同 url。

但是,出于 SEO 和链接的目的(并且只是为了总体上保持一致),我想强制 Catalyst 只识别一种格式并坚持使用它。

我发现了一个似乎为此构建的模块:Catalyst::Plugin::SanitizeUrl,它的文档说你应该把

使用催化剂“SanitizeUrl”;

inmyapp.pm这将为您处理一切。

但是,每当我使用它时,我都会收到此错误:

Bad request

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

4

3 回答 3

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 在任何请求上以斜线结尾,它将重定向到“默认”方法,即第 404 页。

于 2013-02-08T16:15:56.407 回答
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;
    }
}

如果请求末尾有斜杠,它将始终重定向到相同的 url,但没有斜杠。

于 2013-05-25T00:12:01.230 回答
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');
    }
}

同样,这是一个未经尝试的解决方案,您可能需要检查它。

于 2013-02-07T06:15:56.070 回答