2009-01-16 8 views
17

내가 겪고있는 문제는 HTTPS로 보호되는 웹 사이트의 일부 URL을 유지할 필요가 있고 나머지는 HTTP로 시작된다는 것입니다.PHP에서 HTTPS 요청 감지

일반적으로 사용자의 취향에 따라 $_SERVER['HTTP_HTTPS'] 또는 $_SERVER['HTTPS']이 있습니다. 또한 포트를 확인할 수 있습니다. 일반 트래픽의 경우 80이고 HTTPS의 경우 443입니다.

내 문제는 인증서가로드 밸런서에 앉아,이 모든 변수를 사용할 수 있으며, 웹 서버 포트에 다른에 트래픽을 전송하기 위해로드 밸런서를 알리는 것입니다 해결하는 80 가지 방법을 http://www.foo.com을 볼 수 있다는 것입니다 포트,하지만로드 밸런서에서 오는 HTTPS를 감지하는 다른 방법이 있다면 궁금해?

답변

14

부하 분산 장치가 SSL 연결의 다른 쪽 끝인 경우로드 균형 조정기가 명시 적으로 제공하는 것보다 더 많은 정보를 얻을 수 없습니다. 나는 http 헤더를 추가하기 위해 갈 것이고, 이미 그렇게하고있을 것이며, 모든 HTTP 헤더를 훑어보고 보일 것이다.

다른 솔루션으로 URL을 기반으로로드 균형 조정기에서 리디렉션을 수행 할 수 있습니다. 사람은 아마존 AWS 탄성로드 밸런서 뒤에 같은 문제가있는 경우 $_SERVER 변수가 포함되어 있기 때문에

+0

네, 좋은 대답 hayalci. 난 그냥이 같은 문제 (내가 생각하는 사이트에서로드 균형 조정) 찾고 있었고 내가 HTTPS 사용을 식별 할 수있는 유일한 방법은 HTTP_NOSSL 헤더를 통해 것 같습니다. true는 HTTP를 의미하고 false는 HTTPS를 의미합니다. –

38

이 솔루션은 간단하다 :

[HTTP_X_FORWARDED_PORT] => 443 
[HTTP_X_FORWARDED_PROTO] => https 

을 따라서 프로토콜을 얻을, 당신은 사용할 수 있습니다

function getRequestProtocol() { 
    if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) 
     return $_SERVER['HTTP_X_FORWARDED_PROTO']; 
    else 
     return !empty($_SERVER['HTTPS']) ? "https" : "http"; 
} 
+2

'$ _SERVER [ 'HTTP_X_FORWARDED_PROTO']'가 $ _SERVER var에 포함되지 않는 경우가 있습니까? – eipark

+0

@eipark 클라이언트 세트 헤더가 있기 때문에 확실하지만 조건부 리턴이 있습니다. – Zaffy

+0

@elpark aws로드 밸런서 뒤에있을 때까지는 문서화 된 기능이므로 아니오라고 대답합니다. http://aws.typepad.com/aws/2010/10/keeping-customers-happy-another-new- elastic-load-balancer-feature.html. – mrucci

2

로드 밸런서가 rediretion을 수행하고 force_ssl 설정을 1 또는 2로 설정하면 joomla가 항상보고 있기 때문에 무한 루프가 끝나기 때문에 $ _SERVER [ 'HTTP_X_FORWARDED_PROTO']는 joomla 사용자에게 좋은 솔루션 인 것처럼 보입니다. http :