2010-12-17 6 views
1

모든 페이지에 ssl을 사용해야하는 cakephp 사이트를 개발했습니다. 컨트롤러에서 리디렉션을 사용할 때를 제외하고 예상대로 작동합니다. https : //subdomain.domain.com/controller/action이 아닌 http : //subdomain.domain.com으로 리디렉션됩니다.cakephp ssl 사이트 경로를 http가 아닌 https로 리디렉션

내가 CakePHP의 응용 프로그램에 포트 80 포인팅에 대한 가상 호스트를 만들어이 문제를 해결하고 RewriteRule의 떨어져 htaccess로

한다 RewriteCond % {HTTPS} 이러한 재 작성 규칙을 추가했습니다. (*) https://% {HTTP_HOST} % {REQUEST_URI} [L]

이 상황을 포착하고 https로 리디렉션하지만 이로 인해 서버에 불필요한 추가 트래픽이 발생합니다.

이 추가 트래픽의 원인은 잘못된 URL을 생성하므로 리디렉션 기능입니다. 나는 리다이렉트 함수를 살펴 보았고 router :: url을 호출하여 실제 url을 생성했다. 그러나 라우터가 https가 아닌 https를 사용하는 방법이나 장소를 파악할 수는 없습니다.

답변

0

Apache의 구성이 잘못되었다는 오류가 발견되었습니다.

요청이 https 인 경우에도 RequestHandler-> isSSL()이 false를 반환했기 때문에 Jamies 솔루션을 시도하면서 사이트가 리디렉션 루프에 빠져 들었습니다. 그런 다음 $ _SERVER [ 'https']가 설정되지 않았고 $ _SERVER [ 'port']가 예상대로 443이 아닌 80 이었음을 발견했습니다.

그 시점에서

나는

SSLEngine on 
SSLCertificateFile [path to cert file] 
SSLCertificateKeyFile [path to keyfile] 
에서 문제가 해결 하위 도메인에 대한 가상 호스트에 SSL 지정 이동, 사이트-가능/기본에 내 SSL 지정에 놓여있다 리디렉션 루프가 있습니다.

사실도 내 초기 문제를 해결하기 때문에 $ _SERVER하는 방법 라우터 :: URL 검사 [ 'HTTPS']는 https로 시작하는 URL을 생성 설정 한 경우 : 그렇지 않으면 단지 HTTP :

내가 모두 테스트 한을 Jameies 솔루션과 .htaccess의 재 작성 규칙에 대한 필자의 의견은 모두 수정 된 후 예상대로 작동합니다.

5

나는 추측 약간 데려 갈거야,하지만 난이 일을 어질러이 매우 RewriteRule의 용의자.

"다시 쓰기"가 아니라 "리디렉션"해야합니다. Cake의 생성 된 링크는 일반적으로 루트와 관련이 있으므로 두 번째 매개 변수로 "true"를 전달하지 않으면 프로토콜을 지정하지 마십시오.

나는 또한 잘못된 요청에 응답 할 수 있도록 80과 443에서 수신 대기하는 아파치가 있습니다.

function beforeFilter() { 
    parent::beforeFilter(); 
    $this->_setupSecurity(); 
} 

function _setupSecurity() { 
    $this->Security->blackHoleCallback = '_badRequest'; 
    if(Configure::read('forceSSL')) { 
     $this->Security->requireSecure('*'); 
    } 
} 

/** 
* The main SecurityComponent callback. 
* Handles both missing SSL problems and general bad requests. 
*/ 

function _badRequest() { 
    if(Configure::read('forceSSL') && !$this->RequestHandler->isSSL()) { 
     $this->_forceSSL(); 
    } else { 
     $this->cakeError('error400'); 
    } 
    exit; 
} 

/** 
* Redirect to the same page, but with the https protocol and exit. 
*/ 

function _forceSSL() { 
    $this->redirect('https://' . env('SERVER_NAME') . $this->here); 
    exit; 
} 

가 나는 또한 내 자신의 설정에이를 켜고 꺼짐에 따라 대한 bootstrap.php에서 'forceSSL'옵션이 있습니다 :

내가 같은 일을 할 수있는 내의 AppController 클래스에있는 코드 환경이기 때문에 위의 작업을 수행하려면 true로 설정해야합니다.

0

그 예는 이미 코드북 http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#usage

class AppController extends Controller { 
    // Add security component 
    public $components = array('Security'); 

    public function beforeFilter() { 
     $this->Security->blackHoleCallback = 'forceSSL'; 
     $this->Security->requireSecure(); 
    } 

    // Add this function in your AppController 
    public function forceSSL() { 
     return $this->redirect('https://' . env('SERVER_NAME') . $this->here); 
    } 
} 
에서 언급
관련 문제