PHP 사이트 URL 프로토콜 가져 오기-http 및 https


197

현재 사이트 URL 프로토콜을 설정하는 작은 기능을 작성했지만 SSL이 없으며 https에서 작동하는지 테스트하는 방법을 모릅니다. 이것이 올바른지 말해 주실 수 있습니까?

function siteURL()
{
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $domainName = $_SERVER['HTTP_HOST'].'/';
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

위와 같이해야합니까, 아니면 그냥 할 수 있습니까? :

function siteURL()
{
    $protocol = 'http://';
    $domainName = $_SERVER['HTTP_HOST'].'/'
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

SSL에서 앵커 태그 URL이 http를 사용하더라도 서버가 자동으로 URL을 https로 변환하지 않습니까? 프로토콜을 확인해야합니까?

감사합니다!


1
로컬 웹 서버를 설치하고 자체 서명 된 SSL 인증서를 던지는 것이 더 좋은 방법이 아닙니까? 그렇게하면 스스로 테스트 할 수 있습니다.
Frazell Thomas

그렇습니다. 대단하지만, 어떻게해야할지 모르겠습니다.

4
이것이 귀하의 질문에 대한 답변은 아니지만, 문제에 대한 더 나은 해결책은 (더 이상 알지 못하더라도 확실하지는 않지만) 프로토콜 상대 URL 을 사용하는 것 입니다.
Reese Moore

간단한 질문입니다 ... 동적이 아닌 경우 어떻게 기능을 수행하고 있습니까? URL을 변경하기 위해 vars에 피드하는 것과는 다릅니다. 상수를 정의하지 않는 이유는 무엇입니까? 그것이 내가 한 일입니다. $ protocol = (! empty ($ _ SERVER [ 'HTTPS']) && $ _SERVER [ 'HTTPS']! == 'off'|| $ _SERVER [ 'SERVER_PORT'] == 443)? "https : //": "http : //"; define ( 'SITE_URL', $ protocol. $ _ SERVER [ 'HTTP_HOST']. '/');
HTMLGuy

답변:


69

자동이 아닙니다. 당신의 최고 기능은 좋아 보인다.


19
당신이 단지 프로토콜을 떠나면 그것이 자동이라는 것을 주목할 가치가있다. //mysqite.com대신에https://mysitecom
나는 곰을 한 번 씨름했다.

4
@Pamblam, // 링크가 이메일에없는 한 훌륭하게 작동합니다 :)
TimoSolo

또는 xhr 요청에서
Lucas Morgan

86

이런 종류의 문제를 해결하는 훨씬 편리한 방법이 있지만 늦었습니다. 다른 솔루션은 매우 지저분합니다. 이것이 내가하는 방법입니다.

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === 0 ? 'https://' : 'http://';

... 또는 원하는 경우 조건없이 :

$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';

보세요 $_SERVER["SERVER_PROTOCOL"]


20
"HTTPS"이 그나마 작업 stackoverflow.com/questions/16825243/...
wormhit

@wormhit 그것은 주로 웹 서버가 어떻게 구성되어 있는지에 달려 있습니다
Ivo

왜 당신이 stripos대신 사용 strpos합니까?
Fred

12
$_SERVER['SERVER_PROTOCOL']프로토콜 버전 을 저장 HTTP/1.0하거나 HTTP/1.1프로토콜 버전에 따라 어떤 HTTP 서버 구성에 대해 이야기 https하고 http 쿼리에서 오는이 문자열에 대한 정보를 저장 합니까?
regilero

1
내 경우에는 작동하지 않습니다! 프로토콜이 https 인 $ _SERVER [ 'SERVER_PROTOCOL']에 "HTTP"( "S"제외)가 포함되어 있습니다. $ _SERVER [ 'HTTPS']를 확인하는 것이 더 적절합니다.
Simon Hi

68

이것은 나를 위해 작동

if (isset($_SERVER['HTTPS']) &&
    ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
    isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $protocol = 'https://';
}
else {
  $protocol = 'http://';
}

3
이것은 프록시를 사용하는 경우 작동하는 솔루션입니다 (제 경우 CloudFlare와 같은)
Jesús Carrera

1
이것은 정확합니다-포트 443을 사용한다고해서 https를 가정해서는 안됩니다.
Mark Fisher

24

일부 변경 사항 :

function siteURL() {
  $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || 
    $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $domainName = $_SERVER['HTTP_HOST'];
  return $protocol.$domainName;
}

16

짧은 길

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';

3
REQUEST_SCHEME신뢰할 수 없음
Farnabaz

5
REQUEST_SCHEME는 Apache 2.4까지 사용할 수 없습니다.
KenB

7

나에 따르면 포트 번호 테스트는 좋은 습관이 아니기 때문에 내 솔루션은 다음과 같습니다.

define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));

HTTPS불변는 TRUE경우 $_SERVER['HTTPS']설정 또는 "예" "에", "1"을 "true"로 동일합니다. 그렇지 않으면 FALSE를 반환합니다.


이것은 아마도 가장 좋은 대답 일 것입니다. 이 답변 중 많은 부분이 상황의 일부에서만 발생합니다. 예를 들어 사람들은 $ _SERVER [ 'HTTPS']가 설정되어 있는지 확인하고 있습니다. 많은 프레임 워크에서이 변수를 false 또는 'off'등으로 설정하므로 단순히 설정되어 있는지 확인하면 작동하지 않습니다.
Daniel Dewhurst

1
이것은 대부분의 상황에서 작동하지만 SNAFU 구성이 있고 $ _SERVER [ 'HTTPS']가 실제로 "off"로 설정된 경우가있었습니다. 코드는 여전히 테스트를 "통과"하는 것으로 간주하므로 특정 설정을 허용하도록 수정해야합니다.
Dave Morton

6

IIS를 제외한 모든 시스템의 경우 사이트 자체 URL을 정의하기에 충분합니다.

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].'/';

또는

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].'/';

정확히 원하는 것에 따라 달라집니다 : HTTP_HOST vs. SERVER_NAME


5

프록시의 경우 SERVER_PORT올바른 값을 제공하지 않을 수 있으므로 이것이 나를 위해 일한 것입니다.

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"

4

이 서버 변수를 사용하여 프로토콜 세부 사항을 얻으십시오.

 $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
 echo $scheme; //it gives http:// or https://

이 서버 변수는 신뢰할 수 없습니다. 자세한 내용 은 $ _SERVER [ 'REQUEST_SCHEME']를 신뢰할 수 있습니까?


코드뿐만 아니라 게시물에 더 많은 정보를 추가 할 수 있습니까? 예를 들어 이것이 왜 질문에 대한 답변인지 설명하십시오.
ndsmyter

3

나는 이것이 오래된 질문이라는 것을 알고 있지만 내 사이트에서 이것을 테스트해야했기 때문에 오늘 이것을 보았습니다. 위의 답변은 불필요하게 복잡해 보입니다. 사이트 프로토콜을 설정하려면 테스트 만하면됩니다.$_SERVER['HTTPS']

프로토콜이 HTTPS를 사용하는 경우 $_SERVER['HTTPS']'on'을 반환합니다. 그렇지 않은 경우 변수는 비어 있습니다. 예를 들면 다음과 같습니다.
// test if HTTPS is being used. If it is, the echo will return '$SSL_test: on'. If not HTTPS, '$SSL_test' will remain empty.

$SSL_test = $_SERVER['HTTPS'];

echo '<p>$SSL_test: '.$SSL_test.'</p>';

if($SSL_test == true) {
    echo 'You\'re using SSL';
} else {
    echo 'You\'re not using SSL';
} 

위의 내용을 사용하여 HTTPS를 쉽고 깨끗하게 테스트하고 적절하게 구현할 수 있습니다. :)


2
모든 서버에이 $ _SERVER [ 'HTTPS']가있는 것은 아닙니다.
ChrisDeDavidMindflowAU

2

내 시스템에서 작동 하는 Rid Iculous 의 답변을 사용하여 기능을 만들었습니다 .

function site_protocol() {
    if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&  $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')  return $protocol = 'https://'; else return $protocol = 'http://';
}

그것이 도움이되기를 바랍니다.


2

나는 가장 투표많은 답변을 테스트했으며 그것이 효과 가 없었 습니다.

$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';

일부 웹 서버는 지원하지 않으므로 $_SERVER["HTTPS"]코드가 필요 http://하더라도 코드가 반환 될 수 있습니다.https://
nathanfranke

서버가 지원하지 않으면 https왜 코드가 여전히 반환 https됩니까?
CONvid19

내 서버는 https를 지원하지만 $_SERVER["HTTPS"]변수는 정의되지 않습니다.
nathanfranke

나는 당신의 두 의견에 혼란 스럽습니다. 이러한 특별한 경우를 다루는 새로운 답변을 작성하는 것이 좋습니다. 감사하고 행운을 빕니다!
CONvid19

2
$protocal = 'http';
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || $_SERVER['HTTPS'] == 'on') {$protocal = 'https';}


echo $protocal;

2

CodeIgniter에서 추출 :

if ( ! function_exists('is_https'))
{
    /**
     * Is HTTPS?
     *
     * Determines if the application is accessed via an encrypted
     * (HTTPS) connection.
     *
     * @return  bool
     */
    function is_https()
    {
        if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
        {
            return TRUE;
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
        {
            return TRUE;
        }
        elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
        {
            return TRUE;
        }

        return FALSE;
    }
}

0

https 또는 http의 가장 좋은 해결책은 다음과 같습니다.

<?php
$protocol = '//';  
$site_url = $protocol.$_SERVER["HTTP_HOST"];
?>

그러나 https 또는 http를 표시 할 수 없으므로 이미지와 같은 사이트 콘텐츠를 연결하는 데만 사용됩니다.

https로 사이트를 리디렉션하려면 .htaccess 파일에 다음 코드를 추가하십시오.

<IfModule mod_rewrite.c>
 RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
 RewriteRule ^(.*)$ https://www.your-domain.com$1 [L]
</IfModule>

dowmain 이름으로 www.your-domain.com 을 변경하십시오 .


0

여기 내가하는 방법이 있습니다 ... Rid Iculous의 대답 속기 if else 버전입니다 ...

$protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http';

0

완전한 기능은 다음과 같아야합니다.

function siteURL()
{
    $protocol =  "http://";
    if (
        //straight
        isset($_SERVER['HTTPS']) && in_array($_SERVER['HTTPS'], ['on', 1])
        ||
        //proxy forwarding
        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'
    ) {
        $protocol = 'https://';
    }

    $domainName = $_SERVER['HTTP_HOST'];
    return $protocol . $domainName;
}

노트:

  • HTTP_X_FORWARDED_PROTO도 찾아야합니다 (예 : 프록시 서버)
  • 443 포트에 의존하는 것은 안전하지 않습니다 (https는 다른 포트에서 제공 될 수 있음)
  • 신뢰할 수없는 REQUEST_SCHEME

0

나는이 파티에 조금 늦었다는 것을 알고 있지만, 만약 당신이 $ _SERVER를 사용하지 않는 것을 선호한다면, 일부 PHP 프레임 워크에서는 사용하지 않는 것이 좋습니다; 그리고 당신은 아파치 웹 서버를 가지고 있으며, 당신은 기본 명령을 사용할 수 있습니다 :-

$protocol = apache_getenv('HTTPS') ? 'https:' : 'http:';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.