Mengalihkan dari HTTP ke HTTPS dengan PHP

107

Saya sedang mengerjakan situs web keranjang belanja dan saya ingin mengarahkan pengguna ke halaman HTTPS saat dia memasukkan detail penagihannya dan mempertahankan koneksi HTTPS untuk halaman berikutnya sampai dia keluar.

Apa yang harus saya instal di server (saya menggunakan Apache) untuk melakukan ini, dan bagaimana pengalihan ini dilakukan dari PHP?

Jiwa
sumber

Jawaban:

247

Coba sesuatu seperti ini (seharusnya berfungsi untuk Apache dan IIS):

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
Raphael Michel
sumber
5
Itu tidak selalu berhasil. Saya mencoba menggunakannya dan tidak ada elemen 'https' dalam larik $ _SERVER karena memberikan kesalahan 'terlalu banyak pengalihan'. Akan perlu menggunakan metode lain.
Usman Zaheer
5
Saya harus menguji if( $_SERVER['HTTPS'] == "off")agar kode ini berfungsi. Saya pikir itu karena saya menggunakan IIS, bukan Apache seperti OP.
Nick Pickering
1
@NicholasPickering Jepp, variabel $ _SERVER mungkin berbeda dengan server web.
Raphael Michel
6
Catatan: die () atau exit () dapat menjadi penting untuk diletakkan setelah pengalihan header untuk mencegah sisa halaman dari mengeksekusi (dan mungkin mengirimkan informasi tambahan ke klien) (yaitu ke peretas atau browser yang mungkin tidak menghormati header).
dajon
3
Bergantung pada lingkungan / pengaturan server Anda, Anda mungkin perlu menggunakan $ _SERVER ['HTTP_X_FORWARDED_PROTO'] untuk memeriksa http / https
David Meister
19

Ini adalah cara yang baik untuk melakukannya:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>
Matiasg1982
sumber
1
berfungsi dengan baik yang ditandai sebagai bagus akan mengembalikan pengalihan terlalu banyak setidaknya di Chrome
Thomas J Younsi
Kondisinya !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'akan selalu salah, karena jika bagian terakhir benar, bagian pertama akan salah.
Maks
@ Max: Saya tidak mengerti apa yang Anda katakan. Jika kondisi kedua benar ($ _SERVER ['HTTPS'] == 'on') maka kondisi pertama juga harus BENAR (tentu saja variabel server tersebut disetel, karena berisi nilai!)
OMA
7

Mengalihkan dari HTTP ke HTTPS dengan PHP di IIS

Saya mengalami kesulitan mendapatkan pengalihan ke HTTPS untuk bekerja di server Windows yang menjalankan versi 6 dari MS Internet Information Services (IIS) . Saya lebih terbiasa bekerja dengan Apache di host Linux jadi saya beralih ke Internet untuk meminta bantuan dan ini adalah pertanyaan Stack Overflow dengan peringkat tertinggi saat saya mencari "php redirect http ke https" . Namun, jawaban yang dipilih tidak berhasil untuk saya.

Setelah beberapa kali coba-coba, saya menemukan bahwa dengan IIS, $_SERVER['HTTPS']disetel ke offuntuk koneksi non-TLS. Saya pikir kode berikut akan membantu pengguna IIS lain yang datang ke pertanyaan ini melalui mesin pencari.

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

Sunting : Dari jawaban Stack Overflow lain , solusi yang lebih sederhana adalah memeriksa if($_SERVER["HTTPS"] != "on").

Anthony Geoghegan
sumber
13
@JakeVest Cukup adil. Mengingat bahwa pertanyaan ini tidak ditandai sebagai apache, saya memposting jawaban ini untuk kepentingan pengguna IIS lain (mirip dengan situasi saya) yang mungkin menemukan halaman ini melalui mesin pencari. Saya menganut pandangan bahwa jawaban adalah untuk kepentingan komunitas secara keseluruhan dan bukan hanya OP.
Anthony Geoghegan
6

Anda selalu bisa menggunakan

header('Location: https://www.domain.com/cart_save/');

untuk mengalihkan ke URL penyimpanan.

Tetapi saya akan merekomendasikan untuk melakukannya dengan .htaccess dan aturan penulisan ulang Apache.

powtac.dll
sumber
13
Saya selalu menyarankan untuk memeriksa $ _SERVER ['HTTPS'] sebelum mengalihkan.
Raphael Michel
$ _SERVER ['HTTPS'] tidak selalu disetel, tetapi sebaiknya periksa sebelumnya. Itulah mengapa saya merekomendasikan untuk melakukannya dengan aturan penulisan ulang yang berguna di Apache, yang hanya mengalihkan jika tidak ada di HTTPS.
powtac
Meskipun Apache merekomendasikan untuk tidak menggunakan file .htaccess ekstra (karena memperlambat) tetapi untuk menggunakan aturan penulisan ulang di dalam * .conf Apache.
powtac
1

Di server AWS beanstalk saya, saya tidak melihat variabel $ _SERVER ['HTTPS']. Saya melihat $ _SERVER ['HTTP_X_FORWARDED_PROTO'] yang bisa berupa 'http' atau 'https' jadi jika Anda menghosting di AWS, gunakan ini:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
burung phoenix
sumber