[php] $ _SERVER없이 HTTPS를 사용하고 있는지 확인하는 방법 [ ‘HTTPS’]

$_SERVER['HTTPS']서버가 HTTPS로 안전하게 연결 되어 있는지 확인해야한다고 알려주는 많은 자습서를 온라인에서 보았습니다 . 내 문제는 내가 사용하는 일부 서버 $_SERVER['HTTPS']에서 정의되지 않은 변수이며 오류가 발생한다는 것입니다. 확인할 수있는 다른 변수가 항상 정의되어 있습니까?

분명히하기 위해 현재이 코드를 사용하여 HTTPS 연결인지 확인하고 있습니다.

if(isset($_SERVER['HTTPS'])) {
    if ($_SERVER['HTTPS'] == "on") {
        $secure_connection = true;
    }
}



답변

$_SERVER['HTTPS']정의되지 않은 경우에도 항상 작동합니다 .

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

이 코드는 IIS와 호환됩니다.

로부터 PHP.net 문서 및 사용자 의견 :

1) 스크립트가 HTTPS 프로토콜을 통해 쿼리 된 경우 비어 있지 않은 값으로 설정하십시오.

2) IIS에서 ISAPI를 사용할 때 HTTPS 프로토콜을 통해 요청하지 않은 경우 값이 “off”가됩니다. PHP를 Fast-CGI 응용 프로그램으로 실행하는 IIS7에 대해 동일한 동작이보고되었습니다.

또한 Apache 1.x 서버 (및 손상된 설치)가 $_SERVER['HTTPS']안전하게 연결되어 있어도 정의 되지 않았을 수 있습니다 . 보장되지는 않지만 포트 443의 연결은 일반적으로 보안 소켓을 사용 하므로 추가 포트 확인이 가능합니다.

추가 참고 사항 : 클라이언트와 서버 사이에로드 밸런서가있는 경우이 코드는 클라이언트와로드 밸런서 간의 연결을 테스트하지 않고로드 밸런서와 서버 간의 연결을 테스트합니다. 이전 연결을 테스트하려면 HTTP_X_FORWARDED_PROTO헤더를 사용하여 테스트해야 하지만 훨씬 더 복잡합니다. 이 답변 아래의 최신 의견을 참조하십시오 .


답변

내 솔루션 (표준 조건 [$ _SERVER [ ‘HTTPS’] == ‘on’]이로드 밸런서 뒤에있는 서버에서 작동하지 않기 때문에)은 다음과 같습니다.

$isSecure = false;
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
    $isSecure = true;
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') {
    $isSecure = true;
}
$REQUEST_PROTOCOL = $isSecure ? 'https' : 'http';

HTTP_X_FORWARDED_PROTO : 리버스 프록시 (로드 밸런서)가 HTTPS http : //en.wikipedia 인 경우에도 리버스 프록시 (로드 밸런서)가 HTTP를 사용하여 웹 서버와 통신 할 수 있으므로 HTTP 요청의 원래 프로토콜을 식별하기위한 사실상의 표준입니다
. org / wiki / List_of_HTTP_header_fields # Common_non-standard_request_headers


답변

PHP 문서에 따라 Chacha : “스크립트가 HTTPS 프로토콜을 통해 쿼리 된 경우 비어 있지 않은 값으로 설정하십시오.” 따라서 HTTPS가 실제로 켜져있는 경우 많은 경우 if 문이 false를 반환합니다. $_SERVER['HTTPS']존재하고 비어 있지 않은지 확인하고 싶을 것 입니다. 특정 서버에 대해 HTTPS가 올바르게 설정되지 않은 경우를 확인하십시오 $_SERVER['SERVER_PORT'] == 443.

그러나 일부 서버는 $_SERVER['HTTPS']비어 있지 않은 값으로 설정 되므로이 변수도 확인하십시오.

참조 : 문서 $_SERVER$HTTP_SERVER_VARS[더 이상 사용되지 않음]


답변

이것은 $_SERVER['HTTPS']정의되지 않은 경우에도 작동합니다

if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 ){
    //enable secure connection
}


답변

Apache mod_ssl을 사용하여 서버를 실행하는 데 문제가 있었지만 phpinfo () 및 var_dump ($ _SERVER)는 PHP가 여전히 포트 80에 있다고 생각합니다.

다음은 동일한 문제가있는 사람을위한 해결 방법입니다 ….

<VirtualHost *:443>
  SetEnv HTTPS on
  DocumentRoot /var/www/vhost/scratch/content
  ServerName scratch.example.com
</VirtualHost>

주목할만한 줄은 SetEnv 줄입니다. 이를 사용하고 다시 시작한 후에는 항상 꿈꿔 왔던 HTTPS 환경 변수가 있어야합니다


답변

모든 이전 게시물을 읽지 않고 내 기능을 수행하십시오.

public static function isHttps()
{
    if (array_key_exists("HTTPS", $_SERVER) && 'on' === $_SERVER["HTTPS"]) {
        return true;
    }
    if (array_key_exists("SERVER_PORT", $_SERVER) && 443 === (int)$_SERVER["SERVER_PORT"]) {
        return true;
    }
    if (array_key_exists("HTTP_X_FORWARDED_SSL", $_SERVER) && 'on' === $_SERVER["HTTP_X_FORWARDED_SSL"]) {
        return true;
    }
    if (array_key_exists("HTTP_X_FORWARDED_PROTO", $_SERVER) && 'https' === $_SERVER["HTTP_X_FORWARDED_PROTO"]) {
        return true;
    }
    return false;
}


답변

Apache를 사용하는 경우 항상 신뢰할 수 있습니다

$_SERVER["REQUEST_SCHEME"]

요청 된 URL의 체계를 확인합니다. 그러나 다른 답변에서 언급했듯이 SSL이 실제로 사용되고 있다고 가정하기 전에 다른 매개 변수를 확인하는 것이 좋습니다.