2013-02-06 2 views
2

Catalyst 응용 프로그램을 개발 중이며 Catalyst URL 해석 방법에 문제가 있습니다.촉매 일관된 후행 슬래시 형식의 URL

Catalyst 응용 프로그램에는 컨트롤러 Account이 있다고 가정 해 보겠습니다. 이 경우, 촉매는 인덱스 조치에 대한 동일한 URL로

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

을 해석합니다.

그러나 SEO 및 링크 목적 (전체적으로 일관성이 있어야 함)에 대해 Catalyst에서 하나의 형식 만 인식하고이를 고수해야합니다.

나는이 위해 만들어진 것 같다 하나 개의 모듈 발견했습니다, Catalyst::Plugin::SanitizeUrl를이 문서의 방금 myapp.pm

use Catalyst 'SanitizeUrl';

을 넣어해야하며,이 당신을 위해 모든 것을 처리 할 것이라고 말했습니다. 모든 페이지로드에

Bad request 

:

그러나, 내가 그것을 사용할 때마다 난 그냥이 오류가 발생합니다. 누구든지 Catalyst에 하나의 형식 만 사용하는 간단한 방법을 알고 있습니까?

+0

슬래시가 없거나 또는 두 가지 방법 모두가 잘못된 요청입니까? – ikegami

+0

두 방법. https://rt.cpan.org/Public/Bug/Display.html?id=72399 – srchulo

+0

대체 모듈이 버그 보고서에 나열되어 있습니다. – ikegami

답변

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.

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

는 다시이는 시도해 보지 않은 솔루션은, 당신이 그것을 확인해야합니다. 그것은 '기본'방법에 리디렉션합니다

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

일명 페이지 (404)는 URI가에 슬래시로 끝나는 경우 :

1

하나의 형식 슬래쉬없이 촉매 사용을 강제 할 수있는 간단한 방법은 MyApp.pm에이 방법을 추가 할 것입니다 모든 요청.