পিএইচপি সাইট ইউআরএল প্রোটোকল পান - HTTP বনাম https


197

আমি বর্তমান সাইট ইউআরএল প্রোটোকলটি প্রতিষ্ঠিত করতে একটি সামান্য ফাংশন লিখেছি তবে আমার কাছে এসএসএল নেই এবং এটি 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() );

এসএসএল-এর অধীনে, অ্যাঙ্কর ট্যাগ ইউআরএল এইচটিপি ব্যবহার করে এমনকি সার্ভারটি স্বয়ংক্রিয়ভাবে ইউআরএলটিকে https তে রূপান্তর করে না? প্রোটোকল পরীক্ষা করা কি দরকার?

ধন্যবাদ!


1
কোনও স্থানীয় ওয়েব সার্ভার ইনস্টল করা এবং এটিতে স্ব-স্বাক্ষরিত এসএসএল শংসাপত্র নিক্ষেপ করা কি আপনার পক্ষে ভাল বিকল্প হবে না? এইভাবে আপনি নিজের জন্য এটি পরীক্ষা করতে পারেন।
ফ্রেজেল থমাস

হ্যাঁ, এটি দুর্দান্ত হবে তবে আমি কীভাবে এটি করব তা জানি না।

4
যদিও এটি আপনার প্রশ্নের উত্তর দেয় না, আপনার সমস্যার আরও ভাল সমাধান (যদিও আমি আরও না জেনে নিশ্চিত হতে পারি না) হতে পারে প্রোটোকল সম্পর্কিত সম্পর্কিত URL গুলি ব্যবহার করা ।
রিজ মুর

কেবল একটি দ্রুত প্রশ্ন ... আপনি যদি কোনও ক্রিয়াকলাপটি গতিশীল না করেন তবে কীভাবে আসছেন। এটি ইউআরএল পরিবর্তন করার জন্য কোনও বার খাওয়ানোর মতো নয়। কেন একটি ধ্রুবক সংজ্ঞায়িত হয় না? এটাই আমি করেছি। $ প্রোটোকল = (! খালি (empty _ সার্ভার ['HTTPS']) && & $SERVER ['HTTPS']! == 'অফ' || $ _SERVER ['SERVER_PORT'] == 443)? "https: //": "http: //"; সংজ্ঞায়িত করুন ('SITE_URL', $ প্রোটোকল $ _ সার্ভার ['HTTP_HOST']। '/');
এইচটিএমএলগুই

আমি কি এই পরামর্শ দিতে পারি? stackoverflow.com/questions/6768793/get-the-full-url-in-php
টিমো হুভিনেন

উত্তর:


69

এটি স্বয়ংক্রিয় নয়। আপনার শীর্ষ ফাংশন ঠিক আছে।


19
আপনি কেবল প্রোটোকল ছেড়ে দিলে এটি স্বয়ংক্রিয় হয় তা লক্ষ্য করার মতো বিষয় .. এর //mysqite.comপরিবর্তেhttps://mysitecom
আমি একবার ভালুক কুস্তি দিয়েছিলাম।

4
@ পাব্লাম, // আপনার লিঙ্কটি কোনও ইমেল না থাকলে দুর্দান্ত কাজ করে :)
টিমোসোলো

অথবা এক্সএইচআর অনুরোধে
লুকাস মরগান

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" এই Dont কাজ stackoverflow.com/questions/16825243/...
wormhit

@wormhit এটি প্রধানত কিভাবে আপনার ওয়েবসার্ভার যদিও কনফিগার করা উপর নির্ভর করে
ইভো

এর striposপরিবর্তে আপনি কেন ব্যবহার করছেন strpos?
ফ্রেড

12
$_SERVER['SERVER_PROTOCOL']প্রোটোকল সংস্করণ সংরক্ষণ করার জন্য HTTP/1.0বা তার HTTP/1.1উপর নির্ভর করে তৈরি করা হয়েছে , আপনি httpsHTTP কোয়েরি থেকে আসা এই স্ট্রিংয়ের তথ্য সংরক্ষণ করে কোন ধরণের HTTP সার্ভার কনফিগারেশন সম্পর্কে কথা বলছেন ?
রেজিলিও

1
আমার ক্ষেত্রে কাজ করে না! প্রোটোকলটি https থাকা অবস্থায় _S _SERVER ['SERVER_PROTOCOL'] "HTTP" (কোনও "S" ছাড়াই) ধারণ করে। $ _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
এটিই সমাধানটি কাজ করে যদি কোনও প্রক্সি ব্যবহার করে (যেমন আমার ক্ষেত্রে ক্লাউডফ্লেয়ার)
জেসেস ক্যারিরা

1
এটি সঠিক - আপনি https ধরে নেওয়া উচিত নয় কারণ আপনি 443 বন্দরটি ব্যবহার করছেন।
মার্ক ফিশার

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" সাথে অন্যান্যকে সমতুল্য স্থির "সত্যিকারের", করা হয়। অন্যথায় মিথ্যা ফিরিয়ে দেয়।


এটি সম্ভবত সেরা উত্তর। এই উত্তরগুলি অনেকগুলি শুধুমাত্র পরিস্থিতিগুলির এক শতাংশে হবে। উদাহরণস্বরূপ, লোকেরা কেবল checking _SERVER ['HTTPS'] সেট করা আছে কিনা তা পরীক্ষা করে দেখছে। অনেকগুলি ফ্রেমওয়ার্কগুলি এই ভেরিয়েবলটিকে মিথ্যা বা 'অফ' ইত্যাদি হিসাবে সেট করে, সুতরাং এটির সেটটি কেবল সেট করে কাজ করবে না তা পরীক্ষা করে।
ড্যানিয়েল ডিহার্স্ট

1
যদিও এটি বেশিরভাগ পরিস্থিতিতে কাজ করে, এমন সময় এসেছে যখন একটি কনফিগারেশন এসএনএএফইউ ছিল এবং $ $SERVER ['HTTPS'] আসলে "অফ" হয়ে গেছে। আপনার কোডটি এখনও পরীক্ষাটিকে "পাস" হিসাবে বিবেচনা করবে, সুতরাং সেই নির্দিষ্ট সেটিংটির অনুমতি দেওয়ার জন্য এটি সংশোধন করা উচিত।
ডেভ মর্টন

6

আইআইএস ব্যতীত যে কোনও সিস্টেমের জন্য এটি সাইটের স্ব-ইউআরএল সংজ্ঞায়িত করার পক্ষে যথেষ্ট:

$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'] নির্ভরযোগ্য?


আপনি কি আপনার পোস্টে আরও কিছু তথ্য যুক্ত করতে পারেন, কেবল কোডটিই নয়? উদাহরণস্বরূপ ব্যাখ্যা করুন কেন এটি প্রশ্নের উত্তর?
এনডিএসমিটার

3

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমার সাইটে এটির পরীক্ষার প্রয়োজন হওয়ায় আমি আজ এটি পেরেছি। দেখে মনে হচ্ছে উপরের উত্তরগুলি অযথা জটিল। সাইট প্রোটোকল স্থাপন করতে, আপনাকে যা করতে হবে তা হ'ল পরীক্ষা$_SERVER['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';
} 

আপনি এইচটিটিপিএসের জন্য সহজে এবং পরিষ্কারভাবে পরীক্ষার জন্য উপরেরটি ব্যবহার করতে পারেন এবং সেই অনুযায়ী প্রয়োগ করতে পারেন। :)


2
প্রতিটি সার্ভারের এই $ _SERVER ['HTTPS'] নেই
ক্রিসডেভিডমাইন্ডফ্লোএইউ

2

রিড ইকুলাসের উত্তরটি ব্যবহার করে একটি ফাংশন তৈরি করেছি যা আমার সিস্টেমে কাজ করেছে।

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://
নাথানফ্রানেকে

যদি সার্ভার সমর্থন না করে তবে কোডটি httpsকেন আবার ফিরে আসবে https?
CONvid19

আমার সার্ভারটি https সমর্থন করে তবে $_SERVER["HTTPS"]ভেরিয়েবলটি কখনই সংজ্ঞায়িত হয় না।
নাথানফ্র্যাঙ্কে

আমি আপনার 2 মন্তব্য দ্বারা বিভ্রান্ত। আপনি যদি একটি নতুন উত্তর তৈরি করেন যা বিশেষত বিশেষ কেসগুলি অন্তর্ভুক্ত করে তবে এটি সম্ভবত আরও ভাল। ধন্যবাদ এবং শুভকামনা!
কনভভিড 19


2

কোডআইগনিটার থেকে বের করা:

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>

আপনার ডোমেইন নামের সাথে www.your-domain.com পরিবর্তন করুন ।


0

আমি এখানে এটি কীভাবে করছি ... এটি রিড আইকুলাসের উত্তরের একটি শর্টহ্যান্ড 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 ব্যবহার না করা পছন্দ করেন; এবং আপনার একটি অ্যাপাচি ওয়েব সার্ভার রয়েছে, আপনি এর জাতীয় আদেশটি এভাবে ব্যবহার করতে পারেন: -

$protocol = apache_getenv('HTTPS') ? 'https:' : 'http:';
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.