PHP Get Site URL Protocol - 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 के तहत, सर्वर स्वचालित रूप से यूआरएल को https में परिवर्तित नहीं करता है, भले ही एंकर टैग यूआरएल http का उपयोग कर रहा हो? क्या प्रोटोकॉल के लिए जांच करना आवश्यक है?

धन्यवाद!


1
क्या आपके लिए एक स्थानीय वेब सर्वर स्थापित करना और उस पर स्व हस्ताक्षरित SSL प्रमाणपत्र फेंकना बेहतर विकल्प नहीं होगा? इस तरह आप इसे अपने लिए परख सकते हैं।
फ्रेज़ल थॉमस

हाँ, यह भयानक होगा, लेकिन मुझे नहीं पता कि यह कैसे करना है।

4
हालांकि यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन आपकी समस्या का एक बेहतर समाधान (हालांकि मुझे अधिक जानने के बिना सुनिश्चित नहीं किया जा सकता है) प्रोटोकॉल सापेक्ष URL का उपयोग करना हो सकता है ।
रीस मूर

बस एक त्वरित प्रश्न ... यदि आप गतिशील नहीं हैं, तो आप एक फ़ंक्शन कैसे कर रहे हैं। यह ऐसा नहीं है कि आप इसे url बदलने के लिए कोई भी संस्करण खिलाएं। एक स्थिरांक को परिभाषित क्यों नहीं करते? वही मैंने किया। $ प्रोटोकॉल = (? ($ _ SERVER ['HTTPS') && $ _SERVER ['HTTPS']! == 'बंद' || $ _SERVER ['SERVER_PORT'] == 443) "https: //": "http: //"; परिभाषित ('SITE_URL', $ प्रोटोकॉल। $ _ SERVER ['HTTP_HOST']] '/');
HTMLGuy

क्या मुझे यह सुझाव देना चाहिए? stackoverflow.com/questions/6768793/get-the-full-url-in-php
टिमो हुओवेनन

जवाबों:


69

यह स्वचालित नहीं है। आपका टॉप फंक्शन ठीक लग रहा है।


19
ध्यान देने योग्य बात यह है कि यदि आप प्रोटोकॉल को छोड़ देते हैं, तो यह स्वचालित है। अर्थात //mysqite.comइसके बजायhttps://mysitecom
मैंने एक बार एक भालू को कुश्ती दी।

4
जब तक आपका लिंक किसी ईमेल में नहीं है तब तक @Pamblam, // बहुत अच्छा काम करता है :)
टिमोसोलो

या एक xhr अनुरोध में
ल्यूकस मॉर्गन

86

मुझे पता है कि यह देर हो चुकी है, हालांकि इस तरह की समस्या को हल करने के लिए बहुत अधिक सुविधाजनक तरीका है! अन्य समाधान काफी गड़बड़ हैं; यह है कि मैं इसे कैसे करूंगा:

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

... या शर्त के बिना भी अगर आप पसंद करते हैं:

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

अच्छी तरह से देखिए $_SERVER["SERVER_PROTOCOL"]



@ मुख्य रूप से यह निर्भर करता है कि आपका वेबसर्वर कैसे कॉन्फ़िगर किया गया है
Ivo

किसी भी कारण के striposबजाय आप का उपयोग क्यों strpos?
फ्रेड

12
$_SERVER['SERVER_PROTOCOL']स्टोर करने के लिए HTTP/1.0या HTTP/1.1प्रोटोकॉल संस्करण के आधार पर बनाया गया है , आप httpsHTTP क्वेरी से आने वाले इस स्ट्रिंग की जानकारी को किस तरह के HTTP सर्वर कॉन्फ़िगरेशन के बारे में बात करते हैं ?
regilero

1
मेरे मामले में काम नहीं करता है! $ _SERVER ['SERVER_PROTOCOL'] में "HTTP" (बिना किसी "S") के होते हैं जबकि प्रोटोकॉल https है। $ _SERVER ['HTTPS'] की जाँच करना अधिक उचित है।
साइमन हाय

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)
जेसुसे करेरा

1
यह सही है - आपको केवल 443 पोर्ट का उपयोग करने के कारण आप https को ग्रहण नहीं करना चाहिए।
मार्क फिशर

24

कुछ परिवर्तन:

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


7

क्योंकि पोर्ट नंबर का परीक्षण करना मेरे अनुसार अच्छा अभ्यास नहीं है, मेरा समाधान है:

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

HTTPSनिरंतर रिटर्न TRUEअगर $_SERVER['HTTPS']सेट और या "हाँ" "पर", "1" के बराबर है "सही", है। अन्यथा FALSE लौटाता है।


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

1
हालांकि यह अधिकांश परिस्थितियों में काम करता है, ऐसे समय आए हैं जहां एक विन्यास SNAFU और $ _SERVER ['HTTPS'] वास्तव में "बंद" करने के लिए सेट किया गया था। आपका कोड अभी भी इस बात को मानता है कि परीक्षण को "पास" करने के लिए, इसलिए उस विशेष सेटिंग के लिए अनुमति देने के लिए संशोधन किया जाना चाहिए।
डेव मोर्टन

6

IIS को छोड़कर किसी भी सिस्टम के लिए यह साइट सेल्फ URL को परिभाषित करने के लिए काफी है:

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

या

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

इस बात पर निर्भर करता है कि आप वास्तव में क्या चाहते हैं: HTTP_HOST बनाम 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']'चालू' वापस आ जाएगा। यदि नहीं, तो चर खाली रहेगा। उदाहरण के लिए:
// 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'] नहीं है
क्रिसडाईडविंडफ्लोअउ

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

मैंने सबसे अधिक वोट किए गए answe r का परीक्षण किया है और यह मेरे लिए काम नहीं करता है , मैंने उपयोग करना समाप्त कर दिया है:

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

कुछ वेब सर्वर समर्थन नहीं करते हैं $_SERVER["HTTPS"]और इसलिए आपका कोड http://भले ही वापस आ जाएhttps://
nathanfranke

यदि सर्वर समर्थन नहीं करता है, httpsतो कोड अभी भी क्यों लौटेगा https?
CONvid19

मेरा सर्वर https का समर्थन करता है लेकिन $_SERVER["HTTPS"]चर को कभी भी परिभाषित नहीं किया जाता है।
नथनाफ्रैंक

मैं आपकी 2 टिप्पणियों से भ्रमित हूं। यह शायद बेहतर है यदि आप एक नया उत्तर बनाते हैं जो उन विशेष मामलों को कवर करता है। धन्यवाद और शुभकामनाएँ!
CONvid19


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

यहाँ कैसे मैं यह कर यह एक है ... आशुलिपि if else के संस्करण छुटकारा Iculous के जवाब ...

$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:';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.