2012-10-29 6 views
1

특정 컨트롤러에 대해 SSL을 적용하고 다른 모든 것에 대해서는 SSL을 제거하고 싶습니다. 내가 레거시 응용 프로그램을 지원하고있어특정 컨트롤러에 대해 SSL을 적용하는 가장 좋은 방법은 무엇입니까?

$ssl = $this->request->is('ssl'); 

$forceSecured = in_array($this->request->controller, array('Orders', 'Customers')); 

//remove SSL for non-ssl pages 
if ($ssl && !$forceSecured) { 
    return $this->redirect(Router::match(
        $this->request->params, 
        $this->request, 
        array('absolute' => true, 'scheme' => 'http://') 
      ) 
    ); 
} 

// Force ssl on for ssl pages 
if (!$ssl && $forceSecured) { 
    return $this->redirect(Router::match(
        $this->request->params, 
        $this->request, 
        array('absolute' => true, 'scheme' => 'https://') 
      ) 
    ); 
} 

, 그래서 열심히 여러 가지고 : 나는 내가 기대했던대로 작동하지 않았다, 사용자 정의 컨트롤러 클래스의 _init()에 약간의 시간 전에 조각을했다 코드화 된 경로가 정의되었습니다. 나는 Router :: connect에서 핸들러를 사용할 수있을 것이라고 확신하지만, 나는 모든 요청에 ​​대해 체크를하고 싶다. 계속 경로가 여기 갈 길입니까?

답변

3

두 가지가 재 작성 조건 논리에 도움을 줄 수 있는지 somone에 잡으려면 : (1) 당신은 무엇 redirect() 반환되는 (_init()에서 Response 객체를 반환 할 수 있습니다), (2) 미묘한 디자인 문제가 있습니다. 나는 이런 식으로 일을 건의 할 것입니다 :

protected $_secure = false; 

public function __invoke($request, $params, array $options = array()) { 
    if (!$this->_secure && !$request->is('ssl')) { 
     return parent::__invoke($request, $params, $options); 
    } 
    return $this->redirect(Router::match($request->url, $request, [ 
     'absolute' => true, 'scheme' => 'https://' 
    ])); 
} 

관찰 :

  • 같은 URL에 있지만 프로토콜에 대한 리디렉션하고, 중복 URL을 생성 아무 소용 없다
  • 특정 컨트롤러가 컨트롤러로 리디렉션되는지 여부 결정 당신이 지점에 도착 (당신은 가능성이 지점에 도착합니다) 그냥 나는이 동의
+0

'Response' 객체를 반환하면 문제가 발생합니다. 또한, 나는 그것을 충분히 추상화하지 않았다. 사이드 노트 '$ this-> redirect line'에 닫는 괄호가 없습니다. –

+0

거기, 고쳐 줬어. –

0

왜 응용 프로그램에 연결 되나요? stl을 강제 실행하도록 특정 경로를 캐싱하는 경우 htaccess를 다시 작성하십시오.

SSL은 전송 프로토콜 세부 정보이며 사이트 코드와 아무 관련이 없으므로 apache (또는 nginx)가 이러한 세부 정보를 처리하도록합니다. 사물을 다루는 것이 최선의 것에 대한 책임의 분리.

당신이 exac URL을 제공하는 경우 당신은 내가

+1

비트 컨트롤러 당하지만 액션 당하지 어디하지만 링크 생성에 대해 생각하는이 더 중요 얻는다 및 역방향 라우팅. 응용 프로그램이 웹 서버에서 다시 리디렉션되어야하는 리디렉션이나 http 링크를 출력하는 것은 비효율적입니다. – rmarscher

+0

@rmarscher 응용 프로그램이 30x 리디렉션을 발행하면 왕복 여행이 필요합니다. 응용 프로그램을 완전히 잘라내어 아파치가 끝내도록하라. 응용 프로그램은 결코 경로를 알지 못한다. – Ray

+0

동의하지 않습니다. 페이지를 보호할지 여부는 비즈니스 결정입니다. (1) 다시 쓰기 규칙은 비즈니스 용어로이를 표현할 수있는 추상화를 제공하지 않으며 (2) 비즈니스 논리를위한 장소가 이미 있습니다. 컨트롤러 : 왜 쪼개지? 당신이 말하는 최적화 수준은 * 드물게 * 유효한 관심사입니다. –

관련 문제