2013-10-08 1 views
2

ErrorPage 및 ErrorPage_Controller를 확장하는 "지능적인 오류 페이지"클래스가 있습니다. 기본적으로 다음과 같습니다. a) 404인지 확인한 다음 b) 일부 맞춤 검색 로직을 기반으로 잠재 리디렉션 페이지. 페이지가 다른 곳에 있으면 해당 위치로 사용자가 자동으로 재 지정됩니다. SilverStripe에는 이미 이름이 바뀌거나 이동 된 SiteTree 요소를 기반으로하는이 기본 버전이 있지만이 기능은 고급 버전입니다.SilverStripe 3.1의 확장 된 ErrorPage [_Controller]에서 404 헤더를 오버라이드합니다.

어쨌든, 3.1 이후에는 404 헤더를 무시하는 것이 불가능 해 보입니다 (3.0에서는 문제가 없었지만). 3.1으로

class IntelligentErrorPage_Controller extends ErrorPage_Controller { 
    public function init() { 
    parent::init(); 
    $errorcode = $this->failover->ErrorCode ? $this->failover->ErrorCode : 404; 
    if ($errorcode == 404) { 
     ... some search logic ... 
     if ($RedirectSiteTreePage) 
      return $this->redirect($RedirectSiteTreePage->Link()); 
    } 
    } 
} 

위의 반환 모두 "HTTP/1.1 404 찾을 수 없음"뿐만 아니라은 "위치 : [URL]을"헤더 - 그러나 404 개 상태를 무시하는 것은 불가능 것입니다.

"HTTP/1.1 302 Found"헤더를 어떻게 복원 할 수 있는지 알고 싶습니다.

추신 : 나는 행운과 함께 $ this-> getResponse() -> setStatusCode (302) 등을 시도했다.

답변

4

init() 함수는 ModelAsController에 의해 호출되며이 클래스는 임의의 URL 세그먼트에 적합한 이전 페이지를 찾을 수 없으므로 사용자가 직접 응답을 작성한 후 http 응답을 다시 작성하므로 302 이것은 ModelAsController의 130 행에서 발생합니다. 이를 피하는 방법은 접근 방식을 변경하고 예외를 throw하여 getNestedController 호출을 방지합니다. 편의상 SS_HTTPResponse_Exception이라는 예외가 있습니다.

이 조각은 나를 위해 작동 (302와 함께 우리에게 연락처에 페이지를 리디렉션) : 새로운

<?php 

class IntelligentErrorPage extends ErrorPage { 

} 
class IntelligentErrorPage_Controller extends ErrorPage_Controller { 
    public function init() { 
    parent::init(); 
    $errorcode = $this->failover->ErrorCode ? $this->failover->ErrorCode : 404; 
    if ($errorcode == 404) { 
     //... some search logic ... 
     $response = new SS_HTTPResponse_Exception(); 
     $response->getResponse()->redirect('contact-us'); 
     $this->popCurrent(); 
     throw $response; 
    } 
    } 
} 
+0

학습 뭔가 매일. +1 – schellmax

+0

감사합니다 - 완벽하게 일했습니다! – Axllent

+1

301 리디렉션하는 방법 : $ response-> getResponse() -> redirect ('contact-us', 301); –