我正在开发Catalyst应用程序并且遇到Catalyst
解释网址的问题。
让我们说在我们的Catalyst应用程序中,我们有一个控制器Account
。如果是这种情况,Catalyst将解释
http://mydomain.com/account
和http://mydomain.com/account/
作为索引操作的相同网址。
然而,对于搜索引擎优化和链接目的(并且只是为了保持整体)我想强制Catalyst只识别一种格式并坚持下去。
我找到了一个似乎是为此构建的模块:Catalyst::Plugin::SanitizeUrl,它的文档说你应该放
使用Catalyst' SanitizeUrl';
myapp.pm
中的,这将为您处理一切。
但是,每当我使用它时,我只会得到错误:
Bad request
在每个页面加载。有没有人知道让Catalyst只使用一种格式的简单方法?
答案 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;
}
}
如果请求结尾处有一个尾部斜杠,它将始终重定向到相同的网址但没有斜杠。