it-swarm-id.com

Cara mengarahkan semua permintaan HTTP ke HTTPS

Saya mencoba mengalihkan semua permintaan HTTP tidak aman di situs saya (mis. http://www.example.com) ke HTTPS (https://www.example.com). Saya menggunakan PHP btw. Bisakah saya melakukan ini di .htaccess?

254
Cat

Perbarui: Meskipun jawaban ini telah diterima beberapa tahun yang lalu, perhatikan bahwa pendekatannya adalah sekarang direkomendasikan untuk menentang oleh dokumentasi Apache. Gunakan Redirect sebagai gantinya. Lihat jawaban ini .


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

Sumber

262
Reese Moore

The Apache docs merekomendasikan agar tidak menggunakan penulisan ulang:

Untuk mengarahkan ulang http URL ke https, lakukan hal berikut:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Cuplikan ini harus masuk ke file konfigurasi server utama, bukan ke .htaccess sebagaimana ditanyakan dalam pertanyaan.

Artikel ini mungkin muncul hanya setelah pertanyaan diajukan dan dijawab, tetapi tampaknya cara saat ini untuk pergi.

305
ssc

Saya akan merekomendasikan dengan 301 redirect:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
124
David

Seperti yang saya katakan di pertanyaan ini , saya sarankan Anda menghindari mengarahkan semua permintaan HTTP ke HTTPS mereka secara membabi buta, karena dapat menyebabkan Anda kesan palsu tentang keamanan. Sebagai gantinya, Anda mungkin harus mengarahkan "root" situs HTTP Anda ke root situs HTTPS Anda dan tautan dari sana, hanya ke HTTPS.

Masalahnya adalah bahwa jika beberapa tautan atau formulir di situs HTTPS membuat klien mengirim permintaan ke situs HTTP, isinya akan terlihat, sebelum pengalihan.

Misalnya, jika salah satu halaman Anda ditayangkan melalui HTTPS memiliki formulir yang mengatakan <form action="http://example.com/doSomething"> dan mengirimkan beberapa data yang tidak boleh dikirim dengan jelas, browser pertama-tama akan mengirim permintaan penuh (termasuk entitas, jika itu POST) ke HTTP situs pertama. Pengalihan akan segera dikirim ke browser dan, karena sejumlah besar pengguna menonaktifkan atau mengabaikan peringatan, itu kemungkinan akan diabaikan.

Tentu saja, kesalahan menyediakan tautan yang seharusnya ke situs HTTPS tetapi akhirnya menjadi untuk situs HTTP dapat menyebabkan masalah segera setelah Anda mendapatkan sesuatu yang mendengarkan pada port HTTP pada alamat IP yang sama dengan situs HTTPS Anda. Namun, saya pikir menjaga kedua situs sebagai "cermin" hanya meningkatkan kemungkinan membuat kesalahan, karena Anda mungkin cenderung membuat asumsi bahwa itu akan mengoreksi dirinya sendiri dengan mengarahkan pengguna ke HTTPS, padahal sering terlambat. (Ada diskusi serupa di pertanyaan ini. )

33
Bruno

Saya menemukan bahwa cara terbaik untuk https dan www di domain adalah

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_Host} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
17
GiorgosK

Ini adalah pendekatan pengalihan html yang berfungsi tetapi bukan yang terbaik.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Pendekatan PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approch

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

disalin dari: www.letuslook.org

12
Timothy Nwanwene

Saya suka metode pengalihan ini dari http ke https. Karena saya tidak perlu mengeditnya untuk setiap situs.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
9
Cory

Ini adalah metode yang tepat untuk mengarahkan HTTP ke HTTPS menggunakan .htaccess menurut GoDaddy.com. Baris pertama kode cukup jelas. Baris kedua kode memeriksa untuk melihat apakah HTTPS tidak aktif, dan jika demikian, HTTP diarahkan ke HTTPS dengan menjalankan baris kode ketiga, jika tidak, baris kode ketiga diabaikan.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

6
AnarchyOutlaw

Solusi terbaik tergantung pada kebutuhan Anda. Ini adalah ringkasan dari jawaban yang diposting sebelumnya dengan beberapa konteks yang ditambahkan.

Jika Anda bekerja dengan server web Apache dan dapat mengubah konfigurasinya, ikuti dokumentasi Apache :

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Tetapi Anda juga bertanya apakah Anda bisa melakukannya dalam file .htaccess. Dalam hal ini Anda dapat menggunakan Apache RewriteEngine :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L]

Jika semuanya berfungsi dengan baik dan Anda ingin browser mengingat pengalihan ini, Anda dapat mendeklarasikannya sebagai permanen dengan mengubah baris terakhir ke:

RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Tapi hati-hati jika Anda berubah pikiran tentang pengalihan ini. Browser mengingatnya untuk waktu yang sangat lama dan tidak akan memeriksa apakah itu berubah.

Anda mungkin tidak memerlukan RewriteEngine On baris pertama tergantung pada konfigurasi server web.

Jika Anda mencari solusi PHP, lihat array $ _SERVER dan fungsi header :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI']); 
} 
6
maikel

Menggunakan kode berikut dalam file .htaccess Anda secara otomatis mengalihkan pengunjung ke versi HTTPS situs Anda:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

Jika Anda memiliki file .htaccess yang ada:

Jangan menduplikasi RewriteEngine On.

Pastikan baris yang memulai RewriteCond dan RewriteRule segera ikuti RewriteEngine On yang sudah ada.

6
OpenWebWar

Tambahkan kode berikut ke file .htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

Di mana [nama domain Anda] adalah nama domain situs web Anda.

Anda juga dapat mengalihkan folder tertentu dari nama domain Anda dengan mengganti baris terakhir dari kode di atas dengan:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
5
Rahul

Lakukan semua yang dijelaskan di atas untuk pengalihan. Cukup tambahkan "Keamanan Transportasi HTTP Ketat" ke tajuk Anda. Ini akan menghindari pria di tengah serangan.

Edit file konfigurasi Apache Anda (/etc/Apache2/sites-enabled/website.conf dan /etc/Apache2/httpd.conf misalnya) dan tambahkan yang berikut ke VirtualHost Anda:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

4
Waqas

Jika Anda berada dalam situasi di mana Anda tidak dapat mengakses konfigurasi Apache secara langsung untuk situs Anda, yang banyak platform yang dihosting masih dibatasi dengan cara ini, maka saya sebenarnya akan merekomendasikan pendekatan dua langkah. Alasan mengapa Apache sendiri mendokumentasikan bahwa Anda harus menggunakan opsi konfigurasi mereka terlebih dahulu dan terutama di atas mod_rewrite untuk HTTP ke HTTPS.

Pertama, seperti yang disebutkan di atas, Anda akan mengatur aturan .htaccess mod_rewrite Anda:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Kemudian, dalam file PHP Anda (Anda perlu melakukan ini di tempat yang sesuai untuk situasi Anda, beberapa situs akan menyalurkan semua permintaan melalui satu file PHP, yang lain melayani berbagai halaman tergantung tentang kebutuhan mereka dan permintaan yang diajukan):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

Hal di atas perlu dijalankan SEBELUM kode apa pun yang berpotensi mengekspos data aman di lingkungan yang tidak aman. Dengan demikian situs Anda menggunakan pengalihan otomatis melalui HTACCESS dan mod_rewrite, sementara skrip Anda memastikan tidak ada output yang disediakan ketika tidak diakses melalui HTTPS.

Saya kira kebanyakan orang tidak berpikir seperti ini, dan karena itu Apache menyarankan Anda untuk tidak menggunakan metode ini jika memungkinkan. Namun, itu hanya membutuhkan pemeriksaan tambahan pada akhir pengembangan untuk memastikan data pengguna Anda aman. Semoga ini membantu orang lain yang mungkin harus menggunakan metode yang tidak direkomendasikan karena batasan pada layanan hosting kami berakhir.

3
F. Scott Gale

Melalui .htaccess Ini akan membantu.

RewriteEngine On


RewriteBase /
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Juga, lihat ini untuk Lebih Detail. Bagaimana Mengarahkan Http Ke Https?

2
Roshan Padole

Kecuali Anda memerlukan mod_rewrite untuk hal-hal lain, menggunakan Apache core IF direktif lebih bersih & lebih cepat:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

Anda dapat menambahkan lebih banyak kondisi ke arahan IF, seperti memastikan satu domain kanonik tanpa awalan www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

Ada banyak inersia keakraban dalam menggunakan mod_rewrite untuk semuanya, tetapi lihat apakah ini bekerja untuk Anda.

Info lebih lanjut: https://httpd.Apache.org/docs/2.4/mod/core.html#if

Untuk melihatnya dalam aksi (coba tanpa www. Atau https: //, atau dengan .net alih-alih .com): https://nohodental.com/ (situs yang saya kerjakan).

2
SashaK

Untuk mengalihkan semua permintaan http ke https, Anda dapat menggunakan:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [NE,L,R]

Jika mod-rewrite tidak diaktifkan dan Anda menggunakan Apache 2.4, Anda juga dapat menggunakan Redirect di dalam if directive untuk mengarahkan kembali http permintaan ke https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
2
starkeen

Saya menemukan metode untuk memaksa semua halaman situs saya dialihkan dari http ke halaman analog di https yang berfungsi untuk saya.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
1
Oleg Apanovich

Jika Anda menggunakan Apache, mod_rewrite adalah solusi termudah, dan memiliki banyak dokumentasi online tentang cara melakukannya. Misalnya: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
vcsjones

Keunggulan lain dari masalah ini adalah ketika Load Balancer ikut berperan. 

Situasi adalah sebagai berikut: - Lalu lintas dari browser ke Load Balancer, dan kembali, adalah (seharusnya) HTTPS - Lalu lintas antara Load Balancer dan WebServer yang sebenarnya adalah HTTP. 

Jadi, semua variabel permintaan server di PHP atau Apache menunjukkan bahwa koneksi itu hanya HTTP. Dan direktori HTTP dan HTTPS di Server sama.

RewriteCondition dalam jawaban yang disetujui tidak berfungsi. Ini memberikan loop atau tidak berfungsi. 

Pertanyaannya adalah: Bagaimana cara ini bekerja pada Load Balancer. 

(Atau Load Balancer dikonfigurasi salah. Itulah yang saya harapkan karena saya dapat memindahkan masalahnya ke perusahaan WebHosting :-))

0
BertC

bawa kode ini kepada Anda .htaccess file Redirect HTTP ke HTTPS secara otomatis

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

0
Ehsan Sattari

Ini bekerja untuk saya:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>

dan misalnya, http: // server/foo? email = seseorang% 40example.com redirect biasanya tanpa masalah . File .htaccess terletak di folder root situs web (misalnya bernama public_html) .Mungkin untuk menggunakan RewriteCond% {SERVER_PORT}! ^ 443 $ sebagai gantinya RewriteCond% {HTTPS}! Pada

0
Intacto
 Redirect 301 / https://example.com/

(bekerja untuk saya ketika tidak ada jawaban di atas yang berfungsi)

Bonus:

ServerAlias www.example.com example.com

(https tetap: // www . example.com tidak ditemukan)

0
aalesund

Jika Anda menggunakan Amazon Web Services Elastic Load Balancer yang menerima lalu lintas https dan mengarahkannya ke server Anda dengan http, cara yang benar untuk mengarahkan semua lalu lintas http ke https dijelaskan di sini: https: // aws. Amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb

Gunakan tajuk X-Forwarded-Proto (berisi http atau https) yang selalu disertakan dalam permintaan http dari penyeimbang beban, seperti dijelaskan di sini: https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/ x-forwarded-headers.html

Dalam file httpd.conf:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

Atau di file .htaccess root Anda:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Bonus: itu tidak akan mencoba mengarahkan lalu lintas http pada mesin pengembangan lokal Anda.

0
ScottyB