[htaccess] Cara yang Benar untuk Mengalihkan HTTP ke HTTPS

Apa saja yang harus kita ubah dan lakukan setelah migrasi dari HTTP ke HTTPS?

1. URL Scheme pada Tautan

Kita harus mengubah url scheme http:// ke https:// pada url absolut. Pada url relatif, kita tidak perlu melakukan perubahan.

2. Redirect http ke https

Ketika pengguna menuju ke tautan versi http://host/path, kita alihkan ke https://host/path dengan kode HTTP 301.
Jika menggunakan Apache, berikut adalah cara resmi dari https://wiki.apache.org/httpd/RewriteHTTPToHTTPS:

  1. RewriteEngine On 
  2. # This will enable the Rewrite capabilities 
  3.  
  4. RewriteCond %{HTTPS} !=on 
  5. # This checks to make sure the connection is not already HTTPS 
  6.  
  7. RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] 
  8. # This rule will redirect users from their original location, to the same location but using HTTPS. 
  9. # i.e.  http://www.example.com/foo/ to https://www.example.com/foo/ 
  10. # The leading slash is made optional so that this will work either in httpd.conf 
  11. # or .htaccess context 

Untuk cara yang paling sering ditemukan di tutorial-tutorial adalah:

  1. RewriteEngine On 
  2. RewriteCond %{HTTPS} off 
  3. RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Cukup sederhana, tetapi menurut saya ada yang salah. Kita tidak perlu melakukan capture (.*) karena kita sudah menggunakan variable %{REQUEST_URI}. Kecuali kita menggunakan /$1.
Maka rule yang benar adalah:

  1. RewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
Untuk RewriteCond %{HTTPS} !=on atau RewriteCond %{HTTPS} off bisa kita ganti dengan:
  1. RewriteCond  %{SERVER_PORT} 80 

Tetapi menurut saya lebih tepat tidak menggunakan port. Kecuali yakin hanya akan menggunakan port 80.

Jadi cara yang benar selain cara resmi adalah:

  1. RewriteEngine On 
  2. RewriteCond %{HTTPS} off 
  3. RewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]