আপনি T _SERVER ['HTTPS'] ছাড়াই HTTPS ব্যবহার করছেন কিনা তা কীভাবে খুঁজে পাবেন


190

আমি অনলাইনে অনেক টিউটোরিয়াল দেখেছি যেগুলি আপনাকে $_SERVER['HTTPS']সার্ভারের সংযোগটি এইচটিটিপিএস দিয়ে সুরক্ষিত কিনা তা পরীক্ষা করে দেখার দরকার । আমার সমস্যাটি হ'ল আমি ব্যবহার করি এমন কয়েকটি সার্ভারে $_SERVER['HTTPS']একটি অপরিজ্ঞাত পরিবর্তনশীল যা ফলস্বরূপ ত্রুটি ঘটায়। আমি কি অন্য পরিবর্তনশীল চেক করতে পারি যা সর্বদা সংজ্ঞায়িত হওয়া উচিত?

কেবল স্পষ্ট করে বলতে গেলে, আমি বর্তমানে এই কোডটি এইচটিটিপিএস সংযোগ হিসাবে সমাধান করতে ব্যবহার করছি:

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

কোনও সম্ভাবনার দ্বারা, সেই সার্ভারগুলি যেখানে $ _SERVER ['HTTPS'] অপরিজ্ঞাত রয়েছে সেগুলি HTTPS এ চলছে?
ফ্রেডি

আসলে, তাদের মধ্যে একটি হ'ল আমার বাড়ির ডাব্লুএএমপি সার্ভার। এবং আমি বিশ্বাস করি না যে এটি HTTPS এ চলছে on
টাইলার কার্টার

@ টাইলারকার্টার, কুকি ব্যবহার Secureকরা একটি বিকল্প পদ্ধতি যদিও গটছদের সাথে সাবধান থাকুন।
পেসারিয়ার

উত্তর:


280

অপরিবর্তিত থাকলেও এটি সর্বদা কাজ করা উচিত $_SERVER['HTTPS']:

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

কোডটি আইআইএসের সাথে সামঞ্জস্যপূর্ণ।

থেকে PHP.net ডকুমেন্টেশন এবং ব্যবহারকারীর মন্তব্য :

1) যদি স্ক্রিপ্টটি এইচটিটিপিএস প্রোটোকলের মাধ্যমে জিজ্ঞাসা করা হত তবে একটি খালি নয় মানতে সেট করুন।

2) নোট করুন যে আইআইএস-এর সাথে ইসাপি ব্যবহার করার সময়, এইচটিটিপিএস প্রোটোকলের মাধ্যমে অনুরোধটি করা না হলে মানটি "অফ" হয়ে যায়। (আইআইএস PH পিএইচপি-কে দ্রুত-সিজিআই অ্যাপ্লিকেশন হিসাবে চলমান একই আচরণের কথা জানানো হয়েছে)।

এছাড়াও, অ্যাপাচি 1.x সার্ভারগুলি (এবং ভাঙা ইনস্টলেশন) $_SERVER['HTTPS']সুরক্ষিতভাবে সংযোগ স্থাপন করেও সংজ্ঞায়িত নাও হতে পারে । গ্যারান্টিযুক্ত না হলেও, 443 বন্দরটিতে সংযোগগুলি সম্ভবত কনভেনশন অনুসারে সুরক্ষিত সকেট ব্যবহার করছে , অতএব অতিরিক্ত পোর্ট চেক।

অতিরিক্ত নোট: যদি ক্লায়েন্ট এবং আপনার সার্ভারের মধ্যে লোড ব্যালান্সার থাকে তবে এই কোডটি ক্লায়েন্ট এবং লোড ব্যালান্সারের মধ্যে সংযোগ পরীক্ষা করে না, তবে লোড ব্যালান্সার এবং আপনার সার্ভারের মধ্যে সংযোগ পরীক্ষা করে। পূর্ববর্তী সংযোগটি পরীক্ষা করতে, আপনাকে HTTP_X_FORWARDED_PROTOশিরোনামটি ব্যবহার করে পরীক্ষা করতে হবে তবে এটি করা আরও জটিল complex দেখতে সর্বশেষ মন্তব্য এই উত্তর নিচে।


50
নোট: পোর্ট 443 সংযোগ এনক্রিপ্ট হওয়ার গ্যারান্টি দেয় না
এরিকবিএসচুল্জ

2
@ ডেভিডরডরিগস এটি সত্য নয়। আপনি যেটি বন্দর চান তার উপরে আপনি 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'কৌশলটি করেছে did
ঝুম্মেল

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 দ্বারা সঙ্গে যোগাযোগ করতে পারে //en.wikipedia করুন: http। সংস্থা / উইকি / List_of_HTTP_header_fields # Common_non-standard_request_headers


4
আপনি যদি বার্নিশের বিপরীত প্রক্সি ব্যবহার করেন তবে এটিই সমাধান।
রেটো জহনার

1
আমার সমস্যাটি এই সমাধানের সাথে সমাধান হয়ে গেছে। (পিএইচপি - ডেস্কটপ AWS ইলাস্টিক beanstalk)
user4826347

আপনি যদি ভার ভারসাম্য ব্যবহার করেন তবে এটি সমাধান।
অভিষেক সায়নী

আপনি কোন ধরণের ফাইল এটিকে আঁকছেন? আমি ধরে নিচ্ছি যে এটি .htaccess ফাইলে নেই?
জর্ডান

5
এটি ক্লাউডফ্লেয়ারের দ্বারা সরবরাহিত ফ্রি এইচটিটিপিএসের জন্যও কাজ করে।
অ্যান্টনিভিও

82

পিএইচপি ডকুমেন্টেশন অনুসারে চাচা: "এইচটিটিপিএস প্রোটোকলের মাধ্যমে স্ক্রিপ্টটি জিজ্ঞাসা করা হলে একটি শূন্যস্থান নির্ধারণ করতে সেট করুন।" সুতরাং আপনার যদি বিবৃতিটি এইচটিটিপিএসে চালু রয়েছে এমন অনেক ক্ষেত্রেই মিথ্যা ফিরে আসবে। আপনি যাচাই করতে চাইবেন যেটি $_SERVER['HTTPS']বিদ্যমান এবং এটি খালি নয়। যে কোনও ক্ষেত্রে HTTPS কোনও প্রদত্ত সার্ভারের জন্য সঠিকভাবে সেট করা নেই, আপনি যদি তা পরীক্ষা করে দেখতে পারেন $_SERVER['SERVER_PORT'] == 443

তবে মনে রাখবেন যে কিছু সার্ভারগুলিও $_SERVER['HTTPS']একটি শূন্য ন্যূনতম মান সেট করে, তাই এই পরিবর্তনশীলটিও পরীক্ষা করে দেখতে ভুলবেন না।

তথ্যসূত্র: এর জন্য ডকুমেন্টেশন $_SERVERএবং $HTTP_SERVER_VARS[অবনমিত]


12
ব্যবহার করুন _S _SERVER ['SERVER_PORT'] জটিল হতে পারে ... উদাহরণস্বরূপ ispconfig 81 বন্দরটি সুরক্ষিত পোর্ট হিসাবে ব্যবহার করে তাই আসুন আমরা বলতে পারি যে 443 এসএসএলের জন্য "ডিফল্ট" পোর্ট port
গ্যাব্রিয়েল সোসা

@ গ্যাব্রিয়েল সোসা - সত্য, তবে কেয়াটস কেস ভিত্তিতে কেস ভিত্তিতে সম্বোধন করা যেতে পারে। @ হোবডাভের উত্তর বেশিরভাগ ক্ষেত্রে কাজ করবে।
টিম পোস্ট

মনে রাখবেন যে এটি একটি বিপরীত প্রক্সি পিছনে কাজ করবে না। এক চেক করতে বিবেচনা করতে পারেন 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_SCHEMEফলস্বরূপ পিএইচপি ব্যবহার করা আরও ভাল বলে মনে হচ্ছে$_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

আমার সবেমাত্র একটি সমস্যা ছিল যেখানে আমি অ্যাপাচি Mod_ssl ব্যবহার করে সার্ভারটি চালাচ্ছি, তবুও একটি phpinfo () এবং একটি var_dump (_S _SERVER) দেখিয়েছে যে পিএইচপি এখনও মনে করে যে আমি পোর্ট 80 এ আছি।

একই সমস্যা সহ যে কারও জন্য আমার কর্মসংস্থান এখানে ....

<VirtualHost *:443>
  SetEnv HTTPS on
  DocumentRoot /var/www/vhost/scratch/content
  ServerName scratch.example.com
</VirtualHost>

লক্ষণীয় যে লাইনটি সেটএনভ লাইন। এটি জায়গায় এবং পুনরায় আরম্ভের পরে, আপনার এইচটিটিপিএস এনভায়রনমেন্ট ভেরিয়েবল থাকা উচিত যা আপনি সবসময় স্বপ্ন দেখেছিলেন


5
এইচটিটিপিএস সত্যই কাজ করছে তা নিশ্চিত হওয়া ভাল; এটি সার্ভারটি আপনার কাছে মিথ্যা করে দেবে যদি তা না হয়।
ব্র্যাড কোচ

এছাড়াও এটি কাজ করার জন্য আপনার সেটেনভ মডিউল প্রয়োজন। এটি ডিফল্টরূপে সক্ষম করা হয়েছে তবে কোনও সার্ভার প্রশাসক কীভাবে অক্ষম করতে পারে তা আপনি কখনই জানেন না।
toon81

বিপরীত প্রক্সি মাধ্যমে আপনি ডকারে থাকলে খুব কার্যকর। ধন্যবাদ!
ডিকিরিল

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 + পিএইচপি তে নয় ... সুতরাং এটি বিশ্বাসযোগ্য নয়।
ফিরস আব্দ আলরাহমান

5

বাস্তব উত্তর: একটি [কনফিগারেশন) স্ক্রিপ্টে অনুলিপি-পেস্ট করার জন্য প্রস্তুত

/* 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"]। স্বাভাবিকভাবেই, স্ট্রিংটি সত্য এবং মিথ্যা দ্বারা প্রতিস্থাপন করা যেতে পারে। পিভি বলতে পোর্টালপ্রেস ভেরিয়েবলকে বোঝায় কারণ এটি একটি সরাসরি অনুলিপি-পেস্ট যা সর্বদা কাজ করবে। এই টুকরা একটি উত্পাদন স্ক্রিপ্ট ব্যবহার করা যেতে পারে।


3

আমি মনে করি না যে একটি বন্দর যুক্ত করা ভাল ধারণা - বিশেষত যখন আপনি বিভিন্ন বিল্ড সহ অনেক সার্ভার পেয়েছিলেন। এটি পরিবর্তনের জন্য মনে রাখার জন্য আরও একটি জিনিস যুক্ত করে। ডকের দিকে তাকিয়ে আমি মনে করি কায়সারদের শেষ লাইনটি বেশ ভাল, যাতে:

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

পুরোপুরি যথেষ্ট মনে হচ্ছে।


3

একমাত্র নির্ভরযোগ্য পদ্ধতি হ'ল ইগর এম দ্বারা বর্ণিত একটি method

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

নিম্নলিখিতটি বিবেচনা করুন: আপনি ডিফল্টরূপে (ডিজিয়ান, উবুন্টু) ফাস্টজি_প্যারামগুলিতে নির্দেশিকা সহ ফাস্টসিগি সহ এনগিনেক্স ব্যবহার করছেন:

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

এটি আপনাকে লোড ব্যালেন্সার / প্রক্সি সহ এইচটিটিপিএস ব্যবহার সম্পর্কে কিছু বলবে না।
ব্র্যাড

3

সবচেয়ে কম উপায় আমি ব্যবহার করছি:

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

যদি https ব্যবহার করা হয় তবে $ নিরাপদ_সংযোগটি সত্য।


echo (!empty($_SERVER['HTTPS'])?'https':'http');আপনাকে দেয় httpবাhttps
জাভি এস্তেভ

, এটি তৈরি করুন(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
টিভি

2

$_SERVER['SERVER_PORT']এসএসএল 443 পোর্টে সাধারণত চলমান হিসাবে আপনি এটি পরীক্ষা করতে পারেন তবে এটি নির্বোধ নয়।


। _SERVER ['SERVER_PORT'] তবে তা করে।
টাইলার কার্টার

2

আপনি এই কি মনে করেন?

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

হ্যা এখানে. যদি আপনি কেবল খালি () উপর নির্ভর করেন তবে কোনও 'এইচটিপিপিএস' সূচক না থাকলে পিএইচপি ত্রুটি সহ প্রস্থান করবে।
টনি rmc

3
"খালি () মূলত সংক্ষিপ্ত সমতুল্য! isset ($ var) || $ var == মিথ্যা" - php.net/manual/en/function.empty.php
জন ম্যাগনোলিয়া

2
তুমি ঠিক. মজার কথা আমি মিস করেছি। আমি সর্বদা খালি ভেবেছিলাম () যদি ভেরিয়েবলের অস্তিত্ব না থাকে তবে ব্যর্থ হবে।
টনি আরএমসি

2

আমার সার্ভারে (উবুন্টু 14.10, অ্যাপাচি 2.4, পিএইচপি 5.5) $_SERVER['HTTPS']পিএইচপি স্ক্রিপ্টটি https এর মাধ্যমে লোড হওয়ার পরে ভেরিয়েবল সেট করা থাকে না। আমি জানি না ভুল কি। তবে .htaccessফাইলটিতে নিম্নলিখিত লাইনগুলি এই সমস্যার সমাধান করে:

RewriteEngine on

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

1

এখানে একটি পুনরায় ব্যবহারযোগ্য ফাংশন যা আমি কিছু সময়ের জন্য ব্যবহার করে আসছি। আছে 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;
}

1

কেবল আগ্রহের জন্য, এই মুহুর্তে ক্রোম ক্যানারি প্রেরণ করে

HTTPS : 1

সার্ভারে এবং সার্ভারটি কীভাবে কনফিগার করা হয়েছে তার উপর নির্ভর করে আপনি নিম্নলিখিতটি ফিরে পেয়েছেন

HTTPS : 1, on

এটি আমাদের অ্যাপ্লিকেশনটিকে ভেঙে দিয়েছে কারণ আমরা যদি পরীক্ষা করে যাচ্ছিলাম যা এটি সম্ভবত নেই। এই মুহুর্তে, কেবল ক্রোম ক্যানারি এটি করেছে বলে মনে হয় তবে ক্যানারি থেকে জিনিসগুলি সাধারণত "সাধারণ" ক্রোমে কিছুক্ষণ পরে অবতরণ করে।


1

আপনি যদি লোডবাল্যান্সিং সিস্টেম চেক n _SERVER ['HTTP_HTTPS'] == 1 অন্য চেক এসএসএলে ব্যর্থ হবেন হিসাবে এনজিনেক্স ব্যবহার করেন।


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;

কোড সম্ভাব্য যে কোনও কিছু পরীক্ষা করছে এবং আইআইএস ওয়েব সার্ভারেও কাজ করে। যেহেতু v44 ক্রোম HTTP: 1 সেট করে না তাই HTTP_HTTPS পরীক্ষা করা ঠিক is যদি এই কোডটি https এর সাথে মেলে না তবে এর অর্থ আপনার ওয়েবসভার বা প্রক্সি সার্ভারটি দুর্বলভাবে কনফিগার করা হয়েছে। অ্যাপাচি নিজেই এইচটিটিপিএস পতাকাটি সঠিকভাবে সেট করে তবে আপনি প্রক্সি ব্যবহার করার সময় সমস্যা হতে পারে (যেমন এনজিনেক্স)। আপনাকে অবশ্যই nginx https ভার্চুয়াল হোস্টে কিছু শিরোনাম সেট করতে হবে

proxy_set_header   X-HTTPS 1;

এবং প্রক্সি থেকে এক্স-এইচটিটিপিএস সন্ধান করে HTTPS পতাকাটি সঠিকভাবে সেট করতে কিছু অ্যাপাচি মডিউল ব্যবহার করুন। মোড_ফাকেসেল, মোড_আরপাফ ইত্যাদি অনুসন্ধান করুন


0

আপনি যদি ইনপ্যাপসুলার লোড ব্যালেন্সার ব্যবহার করছেন তবে আপনার সার্ভারের জন্য একটি কাস্টম শিরোনাম উত্পন্ন করতে আপনাকে একটি আইআরুল ব্যবহার করতে হবে। আমি একটি HTTP_X_FORWARDED_PROTO শিরোনাম তৈরি করেছি যা পোর্টটি 80 এ সেট করা থাকলে "HTTP" এবং 443 এর সমান হলে "https" এর সমান।


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 সাইটে আমাদের API প্যাকটি ইনস্টল করেছে তা যাচাই করতে হবে)।

এখানে আমি যে ফাংশনটি ব্যবহার করি তা এখানে রয়েছে - মূলত https কাজ করে কিনা তা দেখার জন্য কেবল URL টির মাধ্যমে URL টি কল করুন!

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


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

আমি এখানে মূল পরামর্শটি ব্যবহার করেছি এবং এইচটিটিপিএস সেট না করা অবস্থায় লগগুলিতে "পিএইচপি নোটিশ" পেয়ে বিরক্ত হয়েছি। নাল-কোয়েলসিং অপারেটর "??" ব্যবহার করে আপনি এড়াতে পারবেন :

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

(দ্রষ্টব্য: পিএইচপি ভি 7 এর আগে উপলব্ধ নয়)


-7

হোবডাভের পোস্ট অনুসারে: "এইচটিটিপিএস প্রোটোকলের মাধ্যমে স্ক্রিপ্টটি জিজ্ঞাসা করা হলে একটি শূন্যস্থান নির্ধারণ করতে সেট করুন।"

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

এটি তৈরি করুন(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
টিভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.