복붙노트

$ _SERVER [ 'HTTPS']없이 HTTPS를 사용하는지 확인하는 방법

PHP

$ _SERVER [ 'HTTPS']없이 HTTPS를 사용하는지 확인하는 방법

서버 연결이 HTTPS로 보안되어 있으면 $ _SERVER [ 'HTTPS']를 확인해야한다는 많은 온라인 자습서를 보았습니다. 내 문제는 내가 사용하는 서버 중 일부에서 $ _SERVER [ 'HTTPS']는 정의되지 않은 변수이므로 오류가 발생합니다. 항상 정의되어야하는 체크 할 수있는 또 다른 변수가 있습니까?

HTTPS 연결인지 확인하기 위해이 코드를 사용하고 있습니다.

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

해결법

  1. ==============================

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

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

    그러나 일부 서버는 $ _SERVER [ 'HTTPS']를 비어 있지 않은 값으로 설정하므로이 변수도 반드시 확인해야합니다.

    참조 : $ _SERVER 및 $ HTTP_SERVER_VARS에 대한 문서 [제공되지 않음]

  2. ==============================

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

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

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

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

    PHP.net 설명서 및 사용자 의견에서 :

    또한 아파치 1.x 서버 (및 깨진 설치)는 안전하게 연결하더라도 $ _SERVER [ 'HTTPS']가 정의되어 있지 않을 수도 있습니다. 보장되지는 않지만 포트 443의 연결은 일반적으로 보안 소켓을 사용하므로 포트를 추가로 확인해야합니다.

  3. ==============================

    3.내 솔루션 (표준 조건 [$ _SERVER [ 'HTTPS'] == 'on']이로드 밸런서 뒤에있는 서버에서 작동하지 않기 때문에)

    내 솔루션 (표준 조건 [$ _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를 사용하여 웹 서버와 통신 할 수 있기 때문에 HTTP 요청의 원래 프로토콜을 식별하기위한 사실상의 표준입니다. http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_headers

  4. ==============================

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

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

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

    5.나는 아파치 mod_ssl을 사용하여 서버를 돌리고 있었지만 phpinfo ()와 var_dump ($ _SERVER)는 여전히 PHP가 여전히 포트 80에 있다고 생각한다는 것을 보여 주었다.

    나는 아파치 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 환경 변수가 있어야합니다.

  6. ==============================

    6.아파치를 사용하고 있다면 항상 의지 할 수 있습니다.

    아파치를 사용하고 있다면 항상 의지 할 수 있습니다.

    $_SERVER["REQUEST_SCHEME"]
    

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

  7. ==============================

    7.REAL 대답 : 복사 준비가되어있는 [config] 스크립트에 붙여 넣기

    REAL 대답 : 복사 준비가되어있는 [config] 스크립트에 붙여 넣기

    /* configuration settings; X=edit may 10th '11 */
    $pv_sslport=443; /* for it might be different, as also Gabriel Sosa stated */
    $pv_serverport=80; /* X */
    $pv_servername="mysite.com"; /* X */
    
    /* X appended after correction by Michael Kopinsky */
    if(!isset($_SERVER["SERVER_NAME"]) || !$_SERVER["SERVER_NAME"]) {
        if(!isset($_ENV["SERVER_NAME"])) {
            getenv("SERVER_NAME");
            // Set to env server_name
            $_SERVER["SERVER_NAME"]=$_ENV["SERVER_NAME"];
        }
    }
    if(!$_SERVER["SERVER_NAME"]) (
        /* X server name still empty? ... you might set $_SERVER["SERVER_NAME"]=$pv_servername; */
    }
    
    if(!isset($_SERVER["SERVER_PORT"]) || !$_SERVER["SERVER_PORT"]) {
        if(!isset($_ENV["SERVER_PORT"])) {
            getenv("SERVER_PORT");
            $_SERVER["SERVER_PORT"]=$_ENV["SERVER_PORT"];
        }
    }
    if(!$_SERVER["SERVER_PORT"]) (
        /* X server port still empty? ... you might set $_SERVER["SERVER_PORT"]=$pv_serverport; */
    }
    
    $pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="on" || $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") :  (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");
    

    $ pv_URIprotocol이 정확하고 사용할 준비가되었습니다. 예 : $ site = $ pv_URIprotocol. $ _ SERVER [ "SERVER_NAME"]. 당연히 문자열은 TRUE와 FALSE로 대체 될 수 있습니다. PV는 항상 작동 할 직접 복사 - 붙여 넣기이므로 PortalPress Variable의 약자입니다. 이 부분은 프로덕션 스크립트에서 사용할 수 있습니다.

  8. ==============================

    8.이전 게시물을 모두 읽지 않고 직접 함수 만들기 :

    이전 게시물을 모두 읽지 않고 직접 함수 만들기 :

    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;
    }
    
  9. ==============================

    9.나는 포트를 추가하는 것이 좋은 생각이라고 생각지 않는다. 특별히 다른 빌드를 가진 많은 서버가있을 때 그렇다. 변화를 기억하기 위해 한 가지 더 추가 할뿐입니다. 나는 카이저의 마지막 라인이 꽤 좋다고 생각합니다.

    나는 포트를 추가하는 것이 좋은 생각이라고 생각지 않는다. 특별히 다른 빌드를 가진 많은 서버가있을 때 그렇다. 변화를 기억하기 위해 한 가지 더 추가 할뿐입니다. 나는 카이저의 마지막 라인이 꽤 좋다고 생각합니다.

    if(!empty($_SERVER["HTTPS"]))
      if($_SERVER["HTTPS"]!=="off")
        return 1; //https
      else
        return 0; //http
    else
      return 0; //http
    

    완벽하게 좋아 보인다.

  10. ==============================

    10.유일한 신뢰할 수있는 방법은 이고르 M.이 기술 한 방법입니다.

    유일한 신뢰할 수있는 방법은 이고르 M.이 기술 한 방법입니다.

    $pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="on" || $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") :  (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");
    

    다음을 고려하십시오. nginx와 fastcgi를 기본적으로 사용하고 있습니다 (debian, ubuntu) fastgi_params는 지시자를 포함합니다 :

    fastcgi_param HTTPS $ https;

    SSL을 사용하지 않는다면, 0이 아닌 'off'가 아닌 빈 값으로 변환됩니다. 너는 운명을 잃었다.

    http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html

  11. ==============================

    11.이러한 매개 변수도 수용 가능하며 웹 서버를 전환 할 때 오탐 (false positive)이 발생하지 않을 가능성이 높습니다.

    이러한 매개 변수도 수용 가능하며 웹 서버를 전환 할 때 오탐 (false positive)이 발생하지 않을 가능성이 높습니다.

  12. ==============================

    12.SSL이 일반적으로 포트 443에서 실행되므로 $ _SERVER [ 'SERVER_PORT']를 확인할 수 있지만 이는 절대 안전한 것은 아닙니다.

    SSL이 일반적으로 포트 443에서 실행되므로 $ _SERVER [ 'SERVER_PORT']를 확인할 수 있지만 이는 절대 안전한 것은 아닙니다.

  13. ==============================

    13.내가 사용하는 가장 짧은 방법 :

    내가 사용하는 가장 짧은 방법 :

    $secure_connection = !empty($_SERVER['HTTPS']);
    

    https가 사용되면 $ secure_connection이 true입니다.

  14. ==============================

    14.내 서버 (우분투 14.10, 아파치 2.4, PHP 5.5)에서는 PHP 스크립트가 https를 통해로드 될 때 변수 $ _SERVER [ 'HTTPS']가 설정되지 않습니다. 나는 무엇이 잘못되었는지 모른다. 그러나 .htaccess 파일의 다음 줄은이 문제를 해결합니다.

    내 서버 (우분투 14.10, 아파치 2.4, PHP 5.5)에서는 PHP 스크립트가 https를 통해로드 될 때 변수 $ _SERVER [ 'HTTPS']가 설정되지 않습니다. 나는 무엇이 잘못되었는지 모른다. 그러나 .htaccess 파일의 다음 줄은이 문제를 해결합니다.

    RewriteEngine on
    
    RewriteCond %{HTTPS} =on [NC] 
    RewriteRule .* - [E=HTTPS:on,NE]
    
  15. ==============================

    15.여기에 재사용 가능한 기능이 있습니다. HTH.

    여기에 재사용 가능한 기능이 있습니다. HTH.

    참고 : 코드에서 사용자 정의 상수 인 HTTPS_PORT 값은 환경에 따라 다를 수 있습니다 (예 : 443 또는 81).

    /**
     * Determine if this is a secure HTTPS connection
     * 
     * @return  bool    True if it is a secure HTTPS connection, otherwise false.
     */
    function isSSL()
    {
        if (isset($_SERVER['HTTPS'])) {
            if ($_SERVER['HTTPS'] == 1) {
                return true;
            } elseif ($_SERVER['HTTPS'] == 'on') {
                return true;
            }
        } elseif ($_SERVER['SERVER_PORT'] == HTTPS_PORT) {
            return true;
        }
    
        return false;
    }
    
  16. ==============================

    16.이거 어떻게 생각해?

    이거 어떻게 생각해?

    if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
        $scheme = 'https';
    else
        $scheme = 'http';
    
  17. ==============================

    17.관심사를 위해, 순간에 크롬 카나리아는 보낸다.

    관심사를 위해, 순간에 크롬 카나리아는 보낸다.

    HTTPS : 1
    

    서버를 구성하는 방법에 따라 다음과 같은 결과를 얻을 수 있습니다.

    HTTPS : 1, on
    

    이것은 우리가 테스트를했기 때문에 우리의 애플리케이션을 망가 뜨 렸습니다. 현재 크롬 카나리아 만이 이것을하는 것처럼 보입니다. 그러나 카나리아에서 나온 것들은 일반적으로 잠시 후 "정상적인"크롬을 사용합니다.

  18. ==============================

    18.로드 밸런싱 시스템으로 nginx를 사용한다면 $ _SERVER [ 'HTTP_HTTPS'] == 1 다른 검사는 SSL에 대해 실패합니다.

    로드 밸런싱 시스템으로 nginx를 사용한다면 $ _SERVER [ 'HTTP_HTTPS'] == 1 다른 검사는 SSL에 대해 실패합니다.

  19. ==============================

    19.

    $secure_connection = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || (!empty($_SERVER['HTTP_HTTPS']) && $_SERVER['HTTP_HTTPS'] != 'off') || $_SERVER['REQUEST_SCHEME'] == 'https' || $_SERVER['SERVER_PORT'] == 443) ? true : false;
    

    코드는 가능한 모든 것을 검사하고 IIS 웹 서버에서도 작동합니다. v44 이후 Chrome은 헤더 HTTP : 1을 설정하지 않으므로 HTTP_HTTPS를 확인하는 것이 좋습니다. 이 코드가 https와 일치하지 않으면 웹 서버 또는 프록시 서버의 구성이 잘못되었다는 의미입니다. 아파치 자체가 HTTPS 플래그를 올바르게 설정하지만 프록시를 사용할 때 문제가 발생할 수 있습니다 (예 : nginx). nginx https 가상 호스트에 헤더를 설정해야합니다.

    proxy_set_header   X-HTTPS 1;
    

    프록시에서 X-HTTPS를 찾으면 일부 Apache 모듈을 사용하여 HTTPS 플래그를 올바르게 설정할 수 있습니다. mod_fakessl, mod_rpaf 등 검색

  20. ==============================

    20.Incapsula의로드 밸런서를 사용하는 경우 IRule을 사용하여 서버에 대한 사용자 정의 헤더를 생성해야합니다. 포트가 80으로 설정된 경우 "http"와 443 인 경우 "https"와 동일한 HTTP_X_FORWARDED_PROTO 헤더를 만들었습니다.

    Incapsula의로드 밸런서를 사용하는 경우 IRule을 사용하여 서버에 대한 사용자 정의 헤더를 생성해야합니다. 포트가 80으로 설정된 경우 "http"와 443 인 경우 "https"와 동일한 HTTP_X_FORWARDED_PROTO 헤더를 만들었습니다.

  21. ==============================

    21.내가 확인하고있는 모든 것이 올바른지 확인하기 위해 전역 필터를 추가 할 것이다.

    내가 확인하고있는 모든 것이 올바른지 확인하기 위해 전역 필터를 추가 할 것이다.

    function isSSL() {
    
        $https = filter_input(INPUT_SERVER, 'HTTPS');
        $port = filter_input(INPUT_SERVER, 'SERVER_PORT');
        if ($https) {
    
            if ($https == 1) {
                return true;
            } elseif ($https == 'on') {
                return true;
            }
        } elseif ($port == '443') {
            return true;
        }
    
        return false;
    }
    
  22. ==============================

    22.한 걸음 더 나아가 내가 연결하는 사이트가 SSL 가능 (한 프로젝트는 사용자에게 URL을 요청하고 HTTP 또는 https 사이트에 API 팩을 설치했는지 확인해야 할 필요가 있는지 확인) 할 기회가 있습니다.

    한 걸음 더 나아가 내가 연결하는 사이트가 SSL 가능 (한 프로젝트는 사용자에게 URL을 요청하고 HTTP 또는 https 사이트에 API 팩을 설치했는지 확인해야 할 필요가 있는지 확인) 할 기회가 있습니다.

    다음은 내가 사용하는 기능입니다. 기본적으로 cURL을 통해 URL을 호출하면 https가 작동하는지 확인할 수 있습니다.

    function hasSSL($url) 
    {
        // take the URL down to the domain name
        $domain = parse_url($url, PHP_URL_HOST);
        $ch = curl_init('https://' . $domain);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); //its a  HEAD
        curl_setopt($ch, CURLOPT_NOBODY, true);          // no body
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  // in case of redirects
        curl_setopt($ch, CURLOPT_VERBOSE, 0); //turn on if debugging
        curl_setopt($ch, CURLOPT_HEADER, 1);     //head only wanted
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);    // we dont want to wait forever
        curl_exec($ch);
        $header = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($header === 200) {
            return true;
        }
        return false;
    }
    

    이것은 내가 당신이 https를 사용하고 있다면 (질문이 묻는 것처럼), 그러나 https를 사용할 수 있다면 (또는 심지어 사용해야하는 경우) 알아내는 것이 가장 신뢰할 수있는 방법입니다.

    참고 : 사이트가 다른 http 및 https 페이지를 가질 수는 있지만 (실제로는 가능하지는 않지만 ...) 가능합니다 (http를 사용하라는 메시지가 표시되면 변경하지 않아도됩니다.) 대다수의 사이트 같은, 그리고 아마도 아마 당신 자신을 재경로해야하지만,이 추가 검사를 사용하여 (물론 내가 말했듯이 프로젝트에서 사용자가 자신의 사이트 정보를 입력하고 당신은 서버 측에서 확인하고 싶어)

  23. ==============================

    23.이게 내가이 문제를 해결할 수있는 방법입니다.

    이게 내가이 문제를 해결할 수있는 방법입니다.

    $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 ||
            !empty($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
                strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0;
    
    return ($https) ? 'https://' : 'http://';
    
  24. ==============================

    24.hobodave의 게시물에 따르면 : "스크립트가 HTTPS 프로토콜을 통해 쿼리 된 경우 비어 있지 않은 값으로 설정하십시오."

    hobodave의 게시물에 따르면 : "스크립트가 HTTPS 프로토콜을 통해 쿼리 된 경우 비어 있지 않은 값으로 설정하십시오."

    if (!empty($_SERVER['HTTPS']))
    {
        $secure_connection = true;
    }
    
  25. from https://stackoverflow.com/questions/1175096/how-to-find-out-if-youre-using-https-without-serverhttps by cc-by-sa and MIT license