Bagaimana saya bisa memaksa ke SSL / https menggunakan halaman .htaccess dan mod_rewrite khusus dalam PHP.
Untuk Apache, Anda dapat menggunakan mod_ssl
untuk memaksa SSL dengan SSLRequireSSL Directive
:
Arahan ini melarang akses kecuali HTTP melalui SSL (yaitu HTTPS) diaktifkan untuk koneksi saat ini. Ini sangat berguna di dalam virtual host atau direktori virtual yang diaktifkan untuk membela terhadap kesalahan konfigurasi yang mengekspos hal-hal yang harus dilindungi. Ketika arahan ini hadir, semua permintaan ditolak yang tidak menggunakan SSL.
Ini tidak akan melakukan redirect ke https. Untuk mengarahkan, coba yang berikut ini dengan mod_rewrite
file .htaccess Anda
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
atau salah satu dari berbagai pendekatan yang diberikan di
Anda juga dapat menyelesaikan ini dari dalam PHP jika penyedia Anda telah menonaktifkan .htaccess (yang tidak mungkin karena Anda memintanya, tapi toh)
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
%{HTTP:X-Forwarded-Proto}
atau%{HTTP:X-Real-Port}
variabel untuk memeriksa apakah SSL dihidupkan.RewriteRule <input-pattern> <output-url>
. Jadi, ruang harus ada di sana, dan single itu^
hanya mengatakan "cocokkan semua URL input".Saya menemukan
mod_rewrite
solusi yang berfungsi baik untuk server proksi dan tidak proksi.Jika Anda menggunakan CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift atau solusi Cloud / PaaS lainnya dan Anda mengalami loop pengalihan dengan pengalihan HTTPS yang normal, coba snippet berikut sebagai gantinya.
sumber
Solusi PHP
Meminjam langsung dari jawaban Gordon yang sangat komprehensif, saya perhatikan bahwa pertanyaan Anda menyebutkan spesifik-halaman dalam memaksakan koneksi HTTPS / SSL.
Kemudian, sebagai dekat dengan bagian atas halaman-halaman ini yang ingin Anda paksa sambungkan melalui PHP, Anda dapat
require()
file terpusat yang berisi fungsi kustom ini (dan yang lainnya), dan kemudian jalankan sajaforceHTTPS()
fungsinya.Solusi HTACCESS / mod_rewrite
Saya belum mengimplementasikan solusi semacam ini secara pribadi (saya cenderung menggunakan solusi PHP, seperti yang di atas, untuk kesederhanaannya), tetapi berikut ini mungkin, setidaknya, awal yang baik.
sumber
RewriteCond %{REQUEST_METHOD} !^POST$
?RewriteCond %{REQUEST_METHOD} !^POST$
harus mencegah pengiriman POST agar tidak terpengaruh oleh pengalihan ini.Solusi berbasis mod-rewrite:
Menggunakan kode berikut di htaccess secara otomatis meneruskan semua permintaan http ke https.
Ini akan mengarahkan permintaan non-www dan www http Anda ke www https versi .
Solusi lain (Apache 2.4 *)
Ini tidak berfungsi pada versi apache yang lebih rendah karena variabel% {REQUEST_SCHEME} ditambahkan ke mod-rewrite sejak 2.4.
sumber
Saya hanya ingin menunjukkan bahwa Apache memiliki aturan pewarisan terburuk ketika menggunakan beberapa file .htaccess di kedalaman direktori. Dua perangkap utama:
RewriteOptions InheritDownBefore
arahan (atau yang serupa) untuk mengubahnya. (lihat pertanyaan)Ini berarti solusi global menyarankan pada Apache Wiki tidak tidak bekerja jika Anda menggunakan file .htaccess lainnya di subdirektori. Saya menulis versi modifikasi yang:
sumber
Sederhana dan Mudah, cukup tambahkan berikut ini
sumber
Kode ini berfungsi untuk saya
sumber
Sederhana
ganti url Anda dengan example.com
sumber
hanya untuk memaksa SSL dengan Apache .htaccess yang dapat Anda gunakan
untuk mengarahkan jawaban di atas sudah benar
sumber
coba kode ini, ini akan berfungsi untuk semua versi URL seperti
http://www.website.com
sumber