Saya telah melihat banyak tutorial online yang mengatakan bahwa Anda perlu memeriksa $_SERVER['HTTPS']
apakah server terhubung dengan HTTPS. Masalah saya adalah bahwa pada beberapa server yang saya gunakan, $_SERVER['HTTPS']
adalah variabel yang tidak ditentukan yang menghasilkan kesalahan. Apakah ada variabel lain yang dapat saya periksa yang harus selalu didefinisikan?
Untuk lebih jelasnya, saya saat ini menggunakan kode ini untuk menyelesaikan jika itu adalah koneksi HTTPS:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
Secure
cookie. Hati-hati dengan gotcha.Jawaban:
Ini harus selalu berfungsi bahkan ketika
$_SERVER['HTTPS']
tidak ditentukan:Kode ini kompatibel dengan IIS.
Dari dokumentasi PHP.net dan komentar pengguna :
Juga, server Apache 1.x (dan instalasi yang rusak) mungkin tidak
$_SERVER['HTTPS']
ditentukan bahkan jika tersambung dengan aman. Meskipun tidak dijamin, koneksi pada port 443, oleh konvensi , kemungkinan menggunakan soket aman , maka port memeriksa tambahan.Catatan tambahan: jika ada penyeimbang beban antara klien dan server Anda, kode ini tidak menguji koneksi antara klien dan penyeimbang beban, tetapi koneksi antara penyeimbang beban dan server Anda. Untuk menguji koneksi sebelumnya, Anda harus menguji menggunakan
HTTP_X_FORWARDED_PROTO
header, tetapi jauh lebih rumit untuk dilakukan; lihat komentar terbaru di bawah jawaban ini.sumber
getservbyname()
hanya referensi, bukan kenyataan, dan tidak dengan cara apa pun menjamin bahwa HTTPS berjalan di port 443.$_SERVER['SERVER_PORT'] !== 443
saya harus melemparkan$_SERVER['SERVER_PORT]
ke integer seperti:intval($_SERVER['SERVER_PORT]) !== 443
strtolower($_SERVER['HTTPS']) !== 'off'
lakukan triknya.Solusi saya (karena kondisi standar [$ _SERVER ['HTTPS'] == 'on'] tidak berfungsi pada server di belakang load balancer) adalah:
HTTP_X_FORWARDED_PROTO: standar de facto untuk mengidentifikasi protokol asal permintaan HTTP, karena proxy terbalik (load balancer) dapat berkomunikasi dengan server web menggunakan HTTP bahkan jika permintaan ke proxy terbalik adalah HTTPS http: //en.wikipedia. org / wiki / List_of_HTTP_header_fields # Common_non-standard_request_headers
sumber
Chacha, per dokumentasi PHP: "Setel ke nilai yang tidak kosong jika skrip ditanyai melalui protokol HTTPS." Jadi pernyataan if Anda di sana akan mengembalikan false dalam banyak kasus di mana HTTPS memang aktif. Anda ingin memverifikasi yang
$_SERVER['HTTPS']
ada dan tidak kosong. Dalam kasus di mana HTTPS tidak diatur dengan benar untuk server yang diberikan, Anda dapat mencoba memeriksa apakah$_SERVER['SERVER_PORT'] == 443
.Tetapi perhatikan bahwa beberapa server juga akan diatur
$_SERVER['HTTPS']
ke nilai yang tidak kosong, jadi pastikan untuk memeriksa variabel ini juga.Referensi: Dokumentasi untuk
$_SERVER
dan$HTTP_SERVER_VARS
[usang]sumber
HTTP_X_FORWARDED_PROTO
atauHTTP_X_FORWARDED_SSL
juga.(((isset($_SERVER['HTTPS'])) && (strtolower($_SERVER['HTTPS']) == 'on')) || ((isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) && (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')))
yang tidak termasuk cek port sama sekali. Jangan ragu untuk menambahkan. :-)SetEnvIf X-Forwarded-SSL on HTTPS=on
akan melakukan trik. Tetapi ini tidak akan berhasilREQUEST_SCHEME
karena php tampaknya lebih baik digunakan$_SERVER['HTTPS']
Ini juga berfungsi ketika
$_SERVER['HTTPS']
tidak ditentukansumber
$_SERVER['HTTPS']
yang belum ditentukan https diaktifkan. Bagaimana tentang itu ?SERVER_PORT
didefinisikan selalu yang memecahkan masalah yang tidak ditentukanHTTPS
Saya baru saja mengalami masalah ketika saya menjalankan server menggunakan Apache mod_ssl, namun sebuah phpinfo () dan var_dump ($ _SERVER) menunjukkan bahwa PHP masih berpikir saya berada di port 80.
Ini solusi saya untuk siapa saja dengan masalah yang sama ....
Baris yang perlu diperhatikan adalah garis SetEnv. Dengan ini di tempat dan setelah restart, Anda harus memiliki variabel lingkungan HTTPS yang selalu Anda impikan
sumber
Membuat fungsi saya sendiri dari membaca semua posting sebelumnya:
sumber
Jika Anda menggunakan Apache, Anda selalu dapat mengandalkan
untuk memverifikasi skema URL yang diminta. Tetapi, seperti disebutkan dalam jawaban lain, lebih baik memverifikasi parameter lain sebelum mengasumsikan SSL benar-benar digunakan.
sumber
Jawaban NYATA: siap untuk salin-tempel ke skrip [konfigurasi]
$pv_URIprotocol
sekarang benar dan siap digunakan; contoh$site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]
. Secara alami, string dapat diganti dengan TRUE dan FALSE juga. PV adalah singkatan dari PortalPress Variable karena merupakan copy-paste langsung yang akan selalu berfungsi. Bagian ini dapat digunakan dalam skrip produksi.sumber
Saya tidak berpikir bahwa menambahkan port adalah ide yang bagus - khususnya ketika Anda mendapatkan banyak server dengan build yang berbeda. itu hanya menambah satu hal lagi yang perlu diingat untuk berubah. melihat doc saya pikir baris terakhir kaiser cukup bagus, sehingga:
sepertinya cukup sempurna.
sumber
Satu-satunya metode yang dapat diandalkan adalah yang dijelaskan oleh Igor M.
Pertimbangkan yang berikut: Anda menggunakan nginx dengan fastcgi, secara default (debian, ubuntu) fastgi_params mengandung arahan:
fastcgi_param HTTPS $ https;
jika Anda TIDAK menggunakan SSL, itu akan diterjemahkan sebagai nilai kosong, bukan 'tidak aktif', bukan 0 dan Anda akan dikutuk.
http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html
sumber
Saya menemukan params ini dapat diterima juga dan lebih dari itu kemungkinan tidak memiliki positif palsu ketika berpindah server web.
$ _SERVER ['HTTPS_SERVER_SUBJECT']
sumber
Cara terpendek yang saya gunakan:
Jika jika https digunakan, maka $ secure_connection benar.
sumber
echo (!empty($_SERVER['HTTPS'])?'https':'http');
memberi Andahttp
atauhttps
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
Anda dapat memeriksa
$_SERVER['SERVER_PORT']
karena SSL biasanya berjalan pada port 443, tetapi ini tidak mudah.sumber
Apa pendapatmu tentang ini?
sumber
Di server saya (Ubuntu 14.10, Apache 2.4, php 5.5) variabel
$_SERVER['HTTPS']
tidak disetel saat skrip php dimuat melalui https. Saya tidak tahu apa yang salah. Tetapi baris berikut dalam.htaccess
file memperbaiki masalah ini:sumber
Berikut adalah fungsi yang dapat digunakan kembali yang telah saya gunakan untuk sementara waktu. HTH.
Catatan: Nilai HTTPS_PORT (yang merupakan konstanta ubahsuaian dalam kode saya) dapat bervariasi pada lingkungan Anda, misalnya mungkin 443 atau 81.
sumber
hanya untuk menarik, krom kenari saat ini mengirimkan
ke server, dan tergantung pada bagaimana server dikonfigurasi dapat berarti Anda mendapatkan kembali yang berikut
Ini merusak aplikasi kami karena kami menguji jika ada, yang jelas tidak. Saat ini, hanya kenari krom yang melakukan hal ini, tetapi perlu dicatat bahwa hal-hal dari kenari umumnya mendarat di krom "normal" beberapa saat kemudian.
sumber
Jika Anda menggunakan nginx sebagai sistem loadbalancing, periksa $ _SERVER ['HTTP_HTTPS'] == 1 cek lain akan gagal untuk ssl.
sumber
Kode memeriksa segala kemungkinan dan berfungsi juga di server web IIS. Chrome sejak v44 tidak menetapkan HTTP header: 1 jadi memeriksa HTTP_HTTPS tidak masalah. Jika kode ini tidak cocok dengan https, itu berarti server web atau server proxy Anda tidak terkonfigurasi dengan baik. Apache sendiri mengatur flag HTTPS dengan benar tetapi mungkin ada masalah ketika Anda menggunakan proxy (misalnya nginx). Anda harus mengatur beberapa header di virtual host nginx https
dan menggunakan beberapa modul Apache untuk mengatur flag HTTPS dengan benar dengan mencari X-HTTPS dari proxy. Cari mod_fakessl, mod_rpaf, dll.
sumber
Jika Anda menggunakan penyeimbang beban Incapsula, Anda harus menggunakan IRule untuk membuat header khusus untuk server Anda. Saya membuat tajuk HTTP_X_FORWARDED_PROTO yang sama dengan "http" jika port diatur ke 80 dan "https" jika sama dengan 443.
sumber
Saya akan menambahkan filter global untuk memastikan semua yang saya periksa benar;
sumber
Saya memiliki kesempatan untuk melangkah lebih jauh dan menentukan apakah situs yang saya sambungkan memiliki kemampuan SSL (satu proyek menanyakan URL kepada pengguna dan kami perlu memverifikasi mereka telah menginstal paket API kami di situs http atau https).
Inilah fungsi yang saya gunakan - pada dasarnya, cukup panggil URL melalui cURL untuk melihat apakah https berfungsi!
Ini adalah cara paling andal yang saya temukan tidak hanya untuk mengetahui JIKA Anda menggunakan https (seperti yang ditanyakan), tetapi jika Anda BISA (atau bahkan HARUS) menggunakan https.
CATATAN: adalah mungkin (meskipun tidak benar-benar mungkin ...) bahwa suatu situs dapat memiliki halaman http dan https yang berbeda (jadi jika Anda disuruh menggunakan http, mungkin Anda tidak perlu mengubah ..) Sebagian besar situs adalah sama, dan mungkin harus mengubah rute Anda sendiri, tetapi pemeriksaan tambahan ini telah digunakan (tentu saja seperti yang saya katakan, dalam proyek di mana pengguna memasukkan info situs mereka dan Anda ingin memastikan dari sisi server)
sumber
Ini adalah bagaimana saya menemukan menyelesaikan ini
sumber
Saya menggunakan saran utama di sini dan merasa terganggu pada "Pemberitahuan PHP" di log ketika HTTPS tidak disetel. Anda dapat menghindarinya dengan menggunakan operator penggabungan nol "??":
(Catatan: tidak tersedia sebelum php v7)
sumber
Sesuai posting hobodave: "Setel ke nilai yang tidak kosong jika skrip ditanyai melalui protokol HTTPS."
sumber
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')