$_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이 실제로 사용되고 있다고 가정하기 전에 다른 매개 변수를 확인하는 것이 좋습니다.
