Bagaimana saya bisa memaksa ke SSL / https menggunakan halaman .htaccess dan mod_rewrite khusus dalam PHP.
Bagaimana saya bisa memaksa ke SSL / https menggunakan halaman .htaccess dan mod_rewrite khusus dalam PHP.
Jawaban:
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.
RewriteEngine On
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Meminjam langsung dari jawaban Gordon yang sangat komprehensif, saya perhatikan bahwa pertanyaan Anda menyebutkan spesifik-halaman dalam memaksakan koneksi HTTPS / SSL.
function forceHTTPS(){
$httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( count( $_POST )>0 )
die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
if( !headers_sent() ){
header( "Status: 301 Moved Permanently" );
header( "Location: $httpsURL" );
exit();
}else{
die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
}
}
}
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 saja forceHTTPS()
fungsinya.
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.
RewriteEngine on
# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$
# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
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.
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Ini akan mengarahkan permintaan non-www dan www http Anda ke www https versi .
Solusi lain (Apache 2.4 *)
RewriteEngine on
RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Ini tidak berfungsi pada versi apache yang lebih rendah karena variabel% {REQUEST_SCHEME} ditambahkan ke mod-rewrite sejak 2.4.
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:
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
Sederhana dan Mudah, cukup tambahkan berikut ini
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Sederhana
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
ganti url Anda dengan example.com
hanya untuk memaksa SSL dengan Apache .htaccess yang dapat Anda gunakan
SSLOptions +StrictRequire
SSLRequireSSL
untuk mengarahkan jawaban di atas sudah benar
coba kode ini, ini akan berfungsi untuk semua versi URL seperti
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]