2013-02-06 4 views
2

Je développe une application Catalyst et j'ai des problèmes avec la façon dont Catalyst interprète les URL. Supposons que dans notre application Catalyst, nous ayons un contrôleur Accountformat d'URL compatible catalyseur avec barre oblique finale

Si tel est le cas, Catalyst interprétera

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

comme la même URL pour l'indice l'action. Cependant, à des fins de référencement et de liaison (et pour être globalement cohérent), je voudrais forcer Catalyst à ne reconnaître qu'un seul format et à y adhérer.

J'ai trouvé un module qui semble être construit pour cela: Catalyst::Plugin::SanitizeUrl, il est dit la documentation que vous devez simplement mettre

use Catalyst 'SanitizeUrl';

dans myapp.pm et cela gérer tout pour vous.

Cependant, chaque fois que je l'utilise je reçois juste cette erreur :

Bad request 

Sur chaque chargement de page. Est-ce que quelqu'un sait d'une façon simple que Catalyst n'utilise qu'un seul format?

+0

Mauvaise requête avec barre oblique, sans les deux voies? – ikegami

+0

dans les deux sens. Il semble qu'il y ait eu un rapport de bug à ce sujet ici: https://rt.cpan.org/Public/Bug/Display.html?id=72399 – srchulo

+0

Un autre module est listé dans ce rapport de bogue. – ikegami

Répondre

0

J'ai fini par combiner ce EDEM dit avec quelques trucs que je l'ai fait, et voici mon résultat final:

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

S'il y a un slash à la fin de la demande, il sera toujours rediriger vers la même URL mais sans la barre oblique.

0

Je suppose que vous pouvez rediriger l'url vers une autre méthode d'action selon que le suivi est / ou non. Ainsi,

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

Encore une fois c'est une solution non éprouvée, vous pourriez avoir besoin de le vérifier.

1

La façon simple de forcer l'utilisation du catalyseur un seul format sans slash est d'ajouter cette méthode pour MyApp.pm:

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

Il redirigera sur la méthode « par défaut » aka page 404 si uri se termine par Slash des demandes.

Questions connexes