2013-02-06 2 views
2

Я разрабатываю приложение Catalyst и столкнулся с проблемой Catalyst интерпретирует URL-адреса.Каталожный формат URL-адреса с завершающей косой чертой

Предположим, что в нашем приложении Catalyst у нас есть контроллер Account. Если это так, то катализатор будет интерпретировать

http://mydomain.com/account and http://mydomain.com/account/

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

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

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

use Catalyst 'SanitizeUrl';

в myapp.pm и это будет обрабатывать все для вас.

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

Bad request 

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

+0

Плохой запрос с завершающей косой чертой, без или в обоих направлениях? – ikegami

+0

в оба конца. Кажется, там был отчет об ошибке здесь: https://rt.cpan.org/Public/Bug/Display.html?id=72399 – srchulo

+0

В этом отчете об ошибке указан альтернативный модуль. – ikegami

ответ

0

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

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

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'); 
    } 
} 

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

1

Простой способ заставить использовать катализатор только один формат без пробелов, это добавить этот метод MyApp.pm:

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

Он будет перенаправлять по методу «по умолчанию» ака Page 404, если URI заканчивается слэш на Любой запрос.