$_SERVER['] 없이 HTTPS를 사용하고 있는지 확인하는 방법HTTPS']
으로 요.$_SERVER['HTTPS']
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 의 메뉴얼과 유저의 코멘트로부터, 다음의 정보를 참조해 주세요.
HTTPS 프로토콜을 통해 스크립트를 쿼리한 경우 빈 값이 아닌 값으로 설정합니다.
IIS와 함께 ISAPI를 사용하는 경우 HTTPS 프로토콜을 통해 요청이 이루어지지 않으면 값이 "off"됩니다(Fast-CGI 응용 프로그램으로 PHP를 실행하는 IIS7에서도 동일한 동작이 보고되었습니다).
1서버이 끊어짐)에는, 「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.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_headers인 경우에도 HTTP를 사용하여 웹 서버와 통신할 수 있으므로 HTTP 요청의 원래 프로토콜을 식별하기 위한 사실상의 표준입니다.
Chacha」PHP는 「HTTPS」의 「HTTPS」의 「HTTPS」의 「HTTPS」의 「HTTPS」의 「HTTPS가 유효하게 있는 는, 됩니다.따라서 실제로 HTTPS가 켜져 있는 경우 대부분의 경우 if 문은 false를 반환합니다. 사실을 됩니다.$_SERVER['HTTPS']
존재하며 비어 있지 않습니다.에 HTTPS 가 않은 는, 「HTTPS」의 됩니다.$_SERVER['SERVER_PORT'] == 443
.
, 에서는, 「」, 「」도 설정할 수 있는 해 주세요.$_SERVER['HTTPS']
값이 비어 있지 않은 값으로 변경되므로 이 변수도 체크해야 합니다.
레퍼런스:및 [사용하지 않음]에 관한 문서
은 이이, 이 this, 이 this, this this, this?$_SERVER['HTTPS']
되어 있지 않다
if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 ){
//enable secure connection
}
이전 투고를 모두 읽고 나만의 기능을 만드는 방법:
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 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 환경 변수가 생깁니다.
Apache 를 사용하고 있는 경우는, 항상 다음의 순서에 따라 주세요.
$_SERVER["REQUEST_SCHEME"]
요청된 URL 스킴을 확인합니다.단, 다른 답변에서 설명한 바와 같이 SSL이 실제로 사용되고 있다고 가정하기 전에 다른 파라미터를 확인하는 것이 좋습니다.
정답: [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(Portal Press Variable) Portal Press Variable(PV; 포털 프레스 변수).이 작품은 제작 대본에 사용할 수 있습니다.
이 답변이 늦은 것은 알지만, 저는 많은 답변을 조합하여 모든 사용 사례에 적합한 간단한 기능을 만들었습니다.
이것을 시험해 보세요.
function is_ssl(){
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO']=="https"){ return true; }
elseif(isset($_SERVER['HTTPS'])){ return true; }
elseif($_SERVER['SERVER_PORT'] == 443){ return true; }
else{ return false; }
}
다음으로 예를 들어 다음과 같은 경우를 사용합니다.
if(is_ssl()){
// WHAT TO DO IF IT IS SSL / HTTPS
}else{
// WHAT TO DO IF IT IS NOT SSL / HTTPS
}
이 코드는 Cloudflare, 공유 호스팅 공급자 등과 함께 작동합니다.
즐거운 시간 되세요.
포트를 추가하는 것은 좋은 생각이 아니라고 생각합니다.특히 빌드가 다른 서버가 많은 경우에는 더욱 그렇습니다.바꿔야 할 것이 하나 더 추가될 뿐입니다.의사 선생님 거 보니까 카이저 마지막 라인이 꽤 좋은 것 같아요. 그래서...
if(!empty($_SERVER["HTTPS"]))
if($_SERVER["HTTPS"]!=="off")
return 1; //https
else
return 0; //http
else
return 0; //http
완벽하게 충분해 보이는데요
신뢰할 수 있는 유일한 방법은 Igor 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을 사용하지 않는 경우 SSL은 0이 아닌 빈 값으로 변환되어 중단됩니다.
http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html
이러한 파라미터도 허용되며 웹 서버를 전환할 때 false positive가 발생하지 않을 가능성이 높습니다.
- $_SERVER[``HTTPS_KEYSIZE']
- $_SERVER[``HTTPS_SECRET KEYSIZE']
- $_SERVER[``HTTPS_SERVER_발행자]
$_SERVER[``HTTPS_SERVER_SUBJECT']
if($_SERVER['HTTPS_KEYSIZE'] != NULL){/*do foobar*/}
가장 짧은 방법:
$secure_connection = !empty($_SERVER['HTTPS']);
https를 사용하는 경우 $secure_connection이 true입니다.
됩니다.$_SERVER['SERVER_PORT']
SSL 443 풀 프루프
어떻게 생각하세요?
if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
$scheme = 'https';
else
$scheme = 'http';
서버2. 5. '(Ubuntu 14.10, Apache 2.4, ph 5.5)' 。$_SERVER['HTTPS']
https php는 php를 사용합니다.뭐가 문제인지 모르겠어요. 다음 은 음 but음음음음 in 。.htaccess
일일: :
RewriteEngine on
RewriteCond %{HTTPS} =on [NC]
RewriteRule .* - [E=HTTPS:on,NE]
여기 제가 오랫동안 사용하고 있는 재사용 가능한 기능이 있습니다.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;
}
단지 흥미를 위해, 크롬 카나리아는 그 순간에
HTTPS : 1
서버의 설정에 따라서는, 다음의 정보를 얻을 수 있는 경우가 있습니다.
HTTPS : 1, on
이 때문에 어플리케이션이 다운되었습니다.온 여부를 테스트하고 있었기 때문입니다만, 실제로는 그렇지 않습니다.현재로서는 크롬 카나리아만이 이것을 하는 것처럼 보이지만, 카나리아에서 나온 것들은 보통 조금 후에 "정상적인" 크롬으로 착지한다는 것에 주목할 필요가 있다.
nginx를 로드밸런싱 시스템으로 사용하는 경우 $_SERVER['를 체크합니다.HTTP_HTTPS'] == ssl에 대한 다른 1개의 체크가 실패합니다.
$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는 HTTP:1 헤더를 설정하지 않으므로 HTTP_를 체크합니다.HTTPS는 정상입니다.이 코드가 https 와 일치하지 않는 경우는, Web 서버 또는 프록시 서버가 올바르게 설정되어 있지 않은 것을 의미합니다.Apache 자체는 HTTPS 플래그를 올바르게 설정하지만 프록시(예: nginx)를 사용하면 문제가 발생할 수 있습니다.nginx https 가상 호스트에서 일부 헤더를 설정해야 합니다.
proxy_set_header X-HTTPS 1;
일부 Apache 모듈을 사용하여 프록시에서 X-HTTPS를 검색하여 HTTPS 플래그를 올바르게 설정합니다.mod_fakessl, mod_rpaf 등을 검색합니다.
한 걸음 더 나아가 접속하고 있는 사이트가 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를 사용하도록 지시받은 경우 변경할 필요가 없습니다).대부분의 사이트는 같기 때문에, 직접 루팅을 실시해야 할 것입니다만, 이 추가 체크는 도움이 됩니다(사용자가 사이트 정보를 입력하고 서버측에서 확인하고 싶은 프로젝트에서는 확실히 유효합니다).
Incapsula의 로드 밸런서를 사용하는 경우 IRule을 사용하여 서버의 커스텀헤더를 생성해야 합니다.HTTP_X_FORWARDED_PROTO 헤더를 작성했습니다.이 헤더는 포트가 80으로 설정되어 있으면 "http", 443으로 설정되어 있으면 "https" 중 하나입니다.
체크하고 있는 모든 것이 올바른지 확인하기 위해 글로벌필터를 추가합니다.
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;
}
이게 내가 이걸 해결하는 방법이야
$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://';
여기서의 메인 제안을 사용하고, HTTPS가 설정되어 있지 않은 로그의 「PHP Notice」에 짜증이 났습니다.null-coalesing 연산자 "를 사용하면 이 문제를 피할 수 있습니다.":
if( ($_SERVER['HTTPS'] ?? 'off') == 'off' ) {
// redirect
}
(주의: php v7 이전 버전에서는 사용할 수 없습니다.)
웹 서버를 제어할 수 없고 어떤 변수가 설정되어 있는지 모르는 경우 다음 php를 업로드하여 확인하십시오.
<?php
echo "<br>1 ".$_SERVER["HTTPS"];
echo "<br>2 ".$_SERVER["SERVER_PORT"];
echo "<br>3 ".$_SERVER["HTTP_X_FORWARDED_PROTO"];
echo "<br>4 ".$_SERVER["HTTP_X_FORWARDED_SSL"];
echo "<br>5 ".$_SERVER["HTTP_HTTPS"];
echo "<br>6 ".$_SERVER["REQUEST_SCHEME"];
?>
<html>
<body>
<br>
Just cruising
</body>
</html>
시스템에 Cloudflare를 사용하고 있습니다.액세스 할 필요가 있었습니다.$_SERVER['HTTP_CF_VISITOR']
가치.
$isSsl = false;
if (isset($_SERVER['HTTP_CF_VISITOR'])) {
$cfDecode = json_decode($_SERVER['HTTP_CF_VISITOR']);
if (!empty($cfDecode) && !empty($cfDecode->scheme) && $cfDecode->scheme == 'https') {
$isSsl = true;
}
}
var_dump($isSsl);
hobodave의 투고에 따르면: "스크립트가 HTTPS 프로토콜을 통해 쿼리된 경우 빈 값이 아닌 값으로 설정합니다."
if (!empty($_SERVER['HTTPS']))
{
$secure_connection = true;
}
언급URL : https://stackoverflow.com/questions/1175096/how-to-find-out-if-youre-using-https-without-serverhttps
'itsource' 카테고리의 다른 글
Python에서 메모리를 명시적으로 해방하려면 어떻게 해야 합니까? (0) | 2022.09.21 |
---|---|
phpmyadmin에서 대용량 SQL 파일을 가져오는 방법 (0) | 2022.09.21 |
변수 초기화, 정의, 선언 간의 차이 (0) | 2022.09.21 |
문자열에 배열에 값이 포함되어 있는지 확인합니다. (0) | 2022.09.21 |
명령줄의 소스를 사용하여 Maven 아티팩트를 설치하는 방법은 무엇입니까? (0) | 2022.09.21 |