अगर आप बिना HTTPS $ _SERVER ['HTTPS'] का उपयोग कर रहे हैं तो कैसे पता करें


190

मैंने कई ट्यूटोरियल ऑनलाइन देखे हैं जो कहते हैं कि आपको जांचना $_SERVER['HTTPS']होगा कि क्या सर्वर कनेक्शन HTTPS के साथ सुरक्षित है। मेरी समस्या यह है कि मेरे द्वारा उपयोग किए जाने वाले कुछ सर्वरों $_SERVER['HTTPS']पर एक अपरिभाषित चर है, जिसके परिणामस्वरूप त्रुटि होती है। क्या एक और चर है जो मैं जांच सकता हूं जिसे हमेशा परिभाषित किया जाना चाहिए?

बस स्पष्ट होने के लिए, मैं वर्तमान में इस कोड का उपयोग यह जानने के लिए कर रहा हूं कि क्या यह HTTPS कनेक्शन है:

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

किसी भी संयोग से, वे सर्वर जहां $ _SERVER ['HTTPS'] अपरिभाषित है, HTTPS पर चल रहे हैं?
फ्रेडी

दरअसल, उनमें से एक मेरा होम WAMP सर्वर है। और मेरा मानना ​​है कि यह HTTPS पर नहीं चल रहा है।
टायलर कार्टर

@TylerCarter, कुकीज़ का उपयोग करने के लिएSecure एक वैकल्पिक तरीका है हालाँकि गोचरों से सावधान रहें।
पचेरियर

जवाबों:


280

$_SERVER['HTTPS']अपरिभाषित होने पर भी यह हमेशा काम करना चाहिए :

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

कोड IIS के साथ संगत है।

से PHP.net प्रलेखन और उपयोगकर्ता टिप्पणियों :

1) यदि स्क्रिप्ट HTTPS प्रोटोकॉल के माध्यम से क्वेरी की गई थी तो एक गैर-रिक्त मान पर सेट करें।

2) ध्यान दें कि IIS के साथ ISAPI का उपयोग करते समय, मान HTTPS प्रोटोकॉल के माध्यम से अनुरोध नहीं किए जाने पर "बंद" हो जाएगा। (IIS व्यवहार को PHP-FastI-CGI एप्लिकेशन के रूप में चलाने के लिए समान व्यवहार की रिपोर्ट की गई है)।

इसके अलावा, Apache 1.x सर्वर (और टूटे हुए इंस्टॉलेशन) को $_SERVER['HTTPS']सुरक्षित रूप से कनेक्ट करने पर भी परिभाषित नहीं किया जा सकता है । हालांकि गारंटी नहीं है, पोर्ट 443 पर कनेक्शन, कन्वेंशन द्वारा , सुरक्षित सॉकेट्स का उपयोग कर रहे हैं , इसलिए अतिरिक्त पोर्ट चेक।

अतिरिक्त नोट: यदि क्लाइंट और आपके सर्वर के बीच लोड बैलेंसर है, तो यह कोड क्लाइंट और लोड बैलेंसर के बीच कनेक्शन का परीक्षण नहीं करता है, लेकिन लोड बैलेंसर और आपके सर्वर के बीच का कनेक्शन है। पूर्व कनेक्शन का परीक्षण करने के लिए, आपको HTTP_X_FORWARDED_PROTOहेडर का उपयोग करके परीक्षण करना होगा , लेकिन यह करना अधिक जटिल है; देखने के नवीनतम टिप्पणियाँ इस जवाब से नीचे।


50
नायब: पोर्ट 443 कनेक्शन की गारंटी नहीं देता है एन्क्रिप्टेड है
ErichBSchulz

2
@DavidRodrigues यह सच नहीं है। आप जो भी पोर्ट चाहते हैं, उस पर आप HTTP / HTTPS का उपयोग कर सकते हैं। getservbyname()केवल एक संदर्भ है, वास्तविकता नहीं है, और किसी भी तरह से गारंटी नहीं है कि HTTPS पोर्ट 443 पर चल रहा है।
ब्रैड

1
मुझे एक छोटी सी समस्या $_SERVER['SERVER_PORT'] !== 443थी $_SERVER['SERVER_PORT]जैसे मुझे एक पूर्णांक में डालना था जैसे:intval($_SERVER['SERVER_PORT]) !== 443
मेकोनारो

1
1) सर्वर पोर्ट की जांच, चिट्टी सर्वरों के लिए एक अतिरिक्त है, अगर जरूरत न हो तो इसे हटा दें। 2) ध्यान दें कि यह मेरे उत्तर में एक ढीली तुलना है;)
ग्रास डबल

1
एक और छोटी सी बात मैं आज में भाग गया। सर्वर 'ऑफ' नहीं 'ऑफ' कर रहा strtolower($_SERVER['HTTPS']) !== 'off'था - चाल चली।
झुमेलमेल

117

मेरा समाधान (क्योंकि मानक स्थितियां [$ _SERVER ['HTTPS'] == 'पर'] लोड बैलेंसर के पीछे सर्वर पर काम नहीं करती हैं):

$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: HTTP अनुरोध के मूल प्रोटोकॉल की पहचान करने के लिए एक वास्तविक मानक, क्योंकि रिवर्स प्रॉक्सी (लोड बैलेंसर) HTTP का उपयोग करने वाले वेब सर्वर के साथ संचार कर सकता है, भले ही रिवर्स प्रॉक्सी के लिए अनुरोध HTTPS http: //en.wikipedia हो। org / wiki / List_of_HTTP_header_fields # Common_non-standard_request_headers


4
यदि आप वार्निश रिवर्स प्रॉक्सी का उपयोग करते हैं तो यह समाधान है।
रेटो ज़ेनेर

1
इस मसले को लेकर मेरा मसला सुलझ गया। (PHP - AWS इलास्टिक बीनस्टॉक)
user4826347

यदि आप लोड बैलेंसरों का उपयोग करते हैं तो यह समाधान है।
अभिषेक सैनी

आप किस प्रकार की फ़ाइल में यह चिपका रहे हैं? मुझे लगता है कि यह .htaccess फ़ाइल में नहीं है?
जॉर्डन

5
यह CloudFlare द्वारा प्रदान किए गए मुफ्त HTTPS के लिए भी काम करता है।
एंथनीवो

82

चाचा, PHP दस्तावेज़ के अनुसार: "स्क्रिप्ट को HTTPS प्रोटोकॉल के माध्यम से क्वेर किए जाने पर एक गैर-रिक्त मान पर सेट करें।" तो अगर आपका बयान वहाँ कई मामलों में गलत होगा, जहां HTTPS वास्तव में है। आप सत्यापित करना चाहेंगे कि $_SERVER['HTTPS']मौजूद है और गैर-रिक्त है। ऐसे मामलों में जहां HTTPS किसी दिए गए सर्वर के लिए सही तरीके से सेट नहीं है, आप जाँच कर सकते हैं कि क्या$_SERVER['SERVER_PORT'] == 443

लेकिन ध्यान दें कि कुछ सर्वर भी सेट होंगे $_SERVER['HTTPS'] एक गैर-रिक्त मान पर , इसलिए इस चर को भी जांचना सुनिश्चित करें।

संदर्भ: के लिए प्रलेखन $_SERVERऔर $HTTP_SERVER_VARS[पदावनत]


12
$ _SERVER का उपयोग करें ['SERVER_PORT'] मुश्किल हो सकता है ... उदाहरण के लिए ispconfig पोर्ट 81 को सुरक्षित पोर्ट के रूप में उपयोग करता है ताकि यह कह सके कि 443 ssl के लिए "डिफ़ॉल्ट" पोर्ट है।
गेब्रियल सोसा

@ गैब्रिएल सोसा - सच है, लेकिन केस के आधार पर कैविएट को संबोधित किया जा सकता है। @ हॉबोड्वे का जवाब सबसे ज्यादा काम करेगा।
टिम पोस्ट

ध्यान दें कि यह रिवर्स प्रॉक्सी के पीछे काम नहीं करेगा। एक HTTP_X_FORWARDED_PROTOया जाँच करने के लिए विचार कर सकते हैं HTTP_X_FORWARDED_SSL
पाओलो

1
मैं इससे सहमत हूं कि अंतिम उपाय पोर्ट नंबर होना चाहिए, इसलिए यहां मेरा चेक है: (((isset($_SERVER['HTTPS'])) && (strtolower($_SERVER['HTTPS']) == 'on')) || ((isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) && (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https'))) जिसमें पोर्ट चेक बिल्कुल भी शामिल नहीं है। जोड़ने के लिए स्वतंत्र महसूस करें। :-)
रोलैंड

@ एक रिवर्स प्रॉक्सी के पीछे एक SetEnvIf X-Forwarded-SSL on HTTPS=onचाल चलेंगे । लेकिन यह REQUEST_SCHEMEphp में एक परिणाम के रूप में के साथ काम नहीं करेगा उपयोग करने के लिए बेहतर लगता है$_SERVER['HTTPS']
एंटोनी गिब्स

14

$_SERVER['HTTPS']अपरिभाषित होने पर यह भी काम करता है

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

2
वे कुछ सर्वर हैं जहां $_SERVER['HTTPS']अभी तक परिभाषित नहीं किया गया है https सक्षम है। उस के बारे में कैसा है ?
जॉन मैक्स

1
@ जॉनमोक्स SERVER_PORTको हमेशा परिभाषित किया गया है कि अपरिभाषित समस्या को हल करता हैHTTPS
थमरैसेलवम

11

मेरे पास बस एक मुद्दा है जहां मैं 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 पर्यावरण चर होना चाहिए जिसका आपने हमेशा सपना देखा था


5
बेहतर होगा सुनिश्चित करें कि HTTPS वास्तव में काम कर रहा है; अगर यह नहीं है तो सर्वर को आपसे झूठ करना पड़ेगा।
ब्रैड कोच

इसके अलावा काम करने के लिए आपको SetEnv मॉड्यूल की आवश्यकता है। यह डिफ़ॉल्ट रूप से सक्षम है, लेकिन आप कभी नहीं जानते कि सर्वर व्यवस्थापक क्या अक्षम कर सकता है।
तून81

मामले में बहुत उपयोगी है कि आप रिवर्स प्रॉक्सी के माध्यम से डॉकटर पर हैं। धन्यवाद!
dikirill

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;
}

7

यदि आप अपाचे का उपयोग कर रहे हैं तो आप हमेशा पर भरोसा कर सकते हैं

$_SERVER["REQUEST_SCHEME"]

अनुरोध की गई URL की योजना को सत्यापित करने के लिए। लेकिन, जैसा कि अन्य उत्तरों में बताया गया है, एसएसएल को वास्तव में उपयोग किए जाने से पहले अन्य मापदंडों को सत्यापित करना समझदारी है।


यह XAMPP पर काम करता है लेकिन सेंटो / एपाचे 2 + PHP पर नहीं ... इसलिए इस पर भरोसा नहीं किया जाता है।
फिरास अब्द अल्रहमान

5

वास्तविक उत्तर: [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 पोर्टलप्रेस वेरिएबल के लिए खड़ा है क्योंकि यह एक डायरेक्ट कॉपी-पेस्ट है जो हमेशा काम करेगा। इस टुकड़े का उपयोग प्रोडक्शन स्क्रिप्ट में किया जा सकता है।


3

मुझे नहीं लगता कि एक पोर्ट को जोड़ना अच्छा विचार है - विशेष रूप से जब आपको अलग-अलग बिल्ड के साथ कई सर्वर मिले। कि बस एक और बात को बदलने के लिए याद करने के लिए कहते हैं। डॉक्टर के विचार से मुझे लगता है कि कैसर की अंतिम पंक्ति काफी अच्छी है, ताकि:

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

पूरी तरह से पर्याप्त लगता है।


3

एकमात्र विश्वसनीय तरीका इगोर एम द्वारा वर्णित है।

$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://");

निम्नलिखित पर विचार करें: आप डिफ़ॉल्ट रूप से (डिबियन, ubuntu) fastgi_params द्वारा fastcgi के साथ nginx का उपयोग कर रहे हैं:

fastcgi_param HTTPS $ https;

यदि आप एसएसएल का उपयोग नहीं कर रहे हैं, तो यह रिक्त मान के रूप में अनुवादित हो जाता है, न कि 'ऑफ', न कि 0 और आप डूम किए जाते हैं।

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


3

मुझे लगता है कि इन पारमों को स्वीकार्य है और अधिक तब वेब सर्वर स्विच करते समय झूठी सकारात्मकता नहीं है।

  1. $ _SERVER [ 'HTTPS_KEYSIZE']
  2. $ _SERVER [ 'HTTPS_SECRETKEYSIZE']
  3. $ _SERVER [ 'HTTPS_SERVER_ISSUER']
  4. $ _SERVER [ 'HTTPS_SERVER_SUBJECT']

    if($_SERVER['HTTPS_KEYSIZE'] != NULL){/*do foobar*/}

यह आपको लोड बैलेंसर / प्रॉक्सी के साथ HTTPS उपयोग के बारे में कुछ नहीं बताता है।
ब्रैड

3

सबसे छोटा तरीका जो मैं उपयोग कर रहा हूं:

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

यदि https का उपयोग किया जाता है, तो $ safe_connection सत्य है।


echo (!empty($_SERVER['HTTPS'])?'https':'http');आपको देता है httpयाhttps
Xavi एस्टेव

, इसे (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
बनाएं

2

आप $_SERVER['SERVER_PORT']सामान्य रूप से पोर्ट 443 पर चलने वाले SSL की जांच कर सकते हैं , लेकिन यह मूर्खतापूर्ण नहीं है।


$ _SERVER ['SERVER_PORT'] हालांकि करता है।
टायलर कार्टर

2

आप इस बारे में क्या सोचते है?

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

हाँ वहाँ है। यदि आप केवल खाली पर भरोसा करते हैं () 'HTTPS' इंडेक्स नहीं होने पर PHP त्रुटि के साथ बाहर निकल जाएगी।
टोनी आरएमसी

3
"खाली () अनिवार्य रूप से समतुल्य के समतुल्य है! isset ($ var) || $ var == false" - php.net/manual/en/function.empty.php
जॉन मैग्नोलिया

2
तुम सही हो। अजीब बात है कि मैं चूक गया। मुझे हमेशा लगता है कि अगर वेरिएबल मौजूद नहीं है तो खाली () फेल हो जाएगा।
टोनी आरएमसी

2

मेरे सर्वर पर (Ubuntu 14.10, Apache 2.4, php 5.5) वैरिएबल $_SERVER['HTTPS']सेट नहीं है जब php स्क्रिप्ट को https के माध्यम से लोड किया जाता है। मुझे नहीं पता कि क्या गलत है। लेकिन .htaccessफ़ाइल में निम्न पंक्तियाँ इस समस्या को हल करती हैं:

RewriteEngine on

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

1

यहाँ एक पुनः प्रयोग करने योग्य कार्य है जिसे मैं कुछ समय से उपयोग कर रहा हूँ। HTH।

नोट: HTTPS_PORT का मूल्य (जो मेरे कोड में एक कस्टम स्थिरांक है) आपके एनवायरमेंट पर भिन्न हो सकता है, उदाहरण के लिए यह ४४३ या HT१ हो सकता है।

/**
 * 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;
}

1

सिर्फ ब्याज के लिए, इस समय क्रोम कैनरी भेजता है

HTTPS : 1

सर्वर के लिए, और कैसे सर्वर कॉन्फ़िगर किया गया है पर निर्भर करता है कि आप निम्नलिखित वापस मिल सकता है

HTTPS : 1, on

इसने हमारे आवेदन को तोड़ दिया क्योंकि हम परीक्षण कर रहे थे अगर यह स्पष्ट रूप से नहीं है। फिलहाल, केवल क्रोम कैनरी ही ऐसा लगता है, लेकिन इसके लायक यह है कि कैनरी की चीजें आम तौर पर "सामान्य" क्रोम में थोड़ी देर बाद उतरती हैं।


1

यदि आप nginx को लोडबैलेंसिंग सिस्टम के रूप में उपयोग करते हैं तो $ _SERVER ['HTTP_HTTPS'] == 1 अन्य चेक 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 वेब सर्वर पर भी काम करता है। Chrome से v44 हेडर सेट नहीं करता है HTTP: 1 इसलिए HTTP_HTTPS की जाँच करना ठीक है। यदि यह कोड https से मेल नहीं खाता है तो इसका मतलब है कि आपका वेबसर्वर या प्रॉक्सी सर्वर खराब तरीके से कॉन्फ़िगर किया गया है। Apache अपने आप HTTPS ध्वज को सही ढंग से सेट करता है लेकिन जब आप प्रॉक्सी (जैसे nginx) का उपयोग करते हैं तो समस्या हो सकती है। आपको कुछ हेडर nginx https वर्चुअल होस्ट में सेट करना होगा

proxy_set_header   X-HTTPS 1;

और प्रॉक्सी से X-HTTPS की तलाश करके HTTPS ध्वज को सही ढंग से सेट करने के लिए कुछ Apache मॉड्यूल का उपयोग करें। Mod_fakessl, mod_rpaf, आदि के लिए खोजें


0

यदि आप Incapsula के लोड बैलेंसर का उपयोग कर रहे हैं, तो आपको अपने सर्वर के लिए एक कस्टम हेडर बनाने के लिए एक IRule का उपयोग करना होगा। मैंने एक HTTP_X_FORWARDED_PROTO हेडर बनाया है जो कि "http" के बराबर है यदि पोर्ट 80 पर सेट है और "https" यदि यह 443 के बराबर है।


0

मैं यह सुनिश्चित करने के लिए एक वैश्विक फ़िल्टर जोड़ूंगा कि मैं जो कुछ भी देख रहा हूं वह सही है;

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;
}

0

मुझे एक कदम और आगे बढ़ना है और यह निर्धारित करना है कि क्या मैं जिस साइट से जुड़ रहा हूं वह एसएसएल सक्षम है (एक परियोजना उपयोगकर्ता से उनके यूआरएल के लिए पूछती है और हमें यह सत्यापित करने की आवश्यकता है कि उन्होंने http या https साइट पर हमारे एपीआई पैक स्थापित किया है)।

यहां वह फ़ंक्शन है जो मैं उपयोग करता हूं - मूल रूप से, बस URL को cURL के माध्यम से यह देखने के लिए कॉल करें कि क्या 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 का उपयोग नहीं कर रहे हैं (जैसा कि सवाल पूछता है), लेकिन यदि आप COULD (या यहां तक ​​कि) का उपयोग कर रहे हैं तो https का उपयोग करें।

नोट: यह संभव है (हालांकि वास्तव में संभावना नहीं है ...) कि एक साइट में अलग-अलग http और https पृष्ठ हो सकते हैं (इसलिए यदि आपको http का उपयोग करने के लिए कहा जाता है, तो शायद आपको बदलने की आवश्यकता नहीं है ...) समान हैं, और शायद आपको खुद को फिर से जांचना चाहिए, लेकिन इस अतिरिक्त जांच का इसका उपयोग है (निश्चित रूप से जैसा कि मैंने कहा, उस परियोजना में जहां उपयोगकर्ता अपनी साइट की जानकारी इनपुट करता है और आप सर्वर साइड से सुनिश्चित करना चाहते हैं)


0

यह है कि मैं इसे कैसे हल करता हूं

$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://';

0

मैंने यहां मुख्य सुझाव का उपयोग किया और HTTPS सेट नहीं होने पर लॉग्स में "PHP नोटिस" पर नाराज हो गया। आप अशक्त-संचालक ऑपरेटर "??" का उपयोग करके इससे बच सकते हैं : "

if( ($_SERVER['HTTPS'] ?? 'off') == 'off' ) {
    // redirect
}

(नोट: php v7 से पहले उपलब्ध नहीं)


-7

Hobodave के पद के अनुसार: "स्क्रिप्ट HTTPS प्रोटोकॉल के माध्यम से क्वेर किए जाने पर गैर-रिक्त मान पर सेट करें।"

if (!empty($_SERVER['HTTPS']))
{
    $secure_connection = true;
}

इसे बनाओ(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
Tivie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.