формат URL-адреса, согласованный с катализатором, с косой чертой в конце

Я разрабатываю приложение Catalyst и не могу понять, как Catalyst интерпретирует URL-адреса.

Допустим, в нашем приложении Catalyst у нас есть контроллер Account. В этом случае Catalyst интерпретирует

http://mydomain.com/account и http://mydomain.com/account/

как тот же URL для действия index.

Однако в целях SEO и ссылок (и просто для общей согласованности) я хотел бы заставить Catalyst распознавать только один формат и придерживаться его.

Я нашел один модуль, который, кажется, создан для этого: Catalyst::Plugin: :SanitizeUrl, в документации говорится, что вы должны просто поместить

используйте Catalyst «SanitizeUrl»;

в myapp.pm, и это все сделает за вас.

Однако всякий раз, когда я его использую, я просто получаю эту ошибку:

Bad request

При каждой загрузке страницы. Кто-нибудь знает простой способ заставить Catalyst использовать только один формат?


person srchulo    schedule 06.02.2013    source источник
comment
Плохой запрос с завершающей косой чертой, без косой черты или в обоих направлениях?   -  person ikegami    schedule 07.02.2013
comment
оба способа. Кажется, здесь действительно был отчет об ошибке: rt.cpan. org/Public/Bug/Display.html?id=72399   -  person srchulo    schedule 07.02.2013
comment
Альтернативный модуль указан в этом отчете об ошибке.   -  person ikegami    schedule 07.02.2013
comment
Я попробовал этот модуль, и на самом деле он не повлиял на мои URL-адреса (с косой чертой или без нее).   -  person srchulo    schedule 07.02.2013


Ответы (3)


Простой способ заставить 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 '');
}

Он будет перенаправлять на метод «по умолчанию», также известный как страница 404, если uri заканчивается косой чертой в любом запросе.

person edem    schedule 08.02.2013

Я думаю, вы можете перенаправить 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');
    }
}

Опять же, это непроверенное решение, возможно, вам придется его проверить.

person Community    schedule 07.02.2013

В итоге я объединил то, что сказал Эдем, с некоторыми вещами, которые сделал я, и вот мой конечный результат:

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-адрес, но без косой черты.

person srchulo    schedule 25.05.2013