Bagaimana Anda mengarahkan HTTPS ke HTTP?

166

Bagaimana Anda mengarahkan HTTPS ke HTTP ?. Yaitu, kebalikan dari apa yang (tampaknya) diajarkan setiap orang.

Saya memiliki server pada HTTPS dimana saya membayar sertifikasi SSL dan mirror yang belum saya miliki dan simpan hanya untuk keadaan darurat sehingga tidak layak mendapatkan sertifikasi.

Di desktop klien saya, saya memiliki BEBERAPA pintasan yang mengarah ke http://production_serverdan https://production_server(keduanya berfungsi). Namun, saya tahu bahwa jika server produksi saya turun, maka DNS forwarding akan masuk dan klien yang memiliki "https" pada pintasan mereka akan menatap https://mirror_server(yang tidak berfungsi) dan layar lebar kegelisahan Internet Explorer 7 yang besar dan gemuk. untuk perusahaan saya.

Sayangnya, saya tidak bisa begitu saja mengubah ini di tingkat klien. Para pengguna ini sangat buta huruf di komputer: dan sangat mungkin takut melihat kesalahan HTTPS "insecurity" (terutama cara Firefox 3 dan Internet Explorer 7 menanganinya saat ini: FULL STOP, agak berterima kasih, tapi tidak membantu saya di sini LOL).

Sangat mudah untuk menemukan solusi Apache untuk pengalihan http-> https , tetapi untuk kehidupan saya, saya tidak bisa melakukan yang sebaliknya.

Ide ide?

mauriciopastrana
sumber
2
Jangan lakukan itu ! Pengalihan HTTPS dari HTTP sangat berbahaya (dan pada kenyataannya akan segera diblokir oleh semua browser karena penyalahgunaan), terutama jika ini adalah simpul melalui status HTTP diam (tetapi hal yang sama berlaku jika ini dilakukan dengan javascript), kecuali jika: - (1) ada halaman parkir HTTPS sementara yang mengundang pengguna untuk membuka tautan dengan mengkliknya secara aktif; atau: - (2) HTTPS mengalihkan ke HTTP pada domain SAMA DAN pengalihan tidak mengubah jenis konten yang diminta. Mengizinkannya di peramban telah memungkinkan banyak malwares melewati isolasi. Pengalihan seperti itu sangat menipu.
verdy_p
4
Ini terlihat seperti situs internal, di mana OP tahu apa yang terjadi dengannya, dan karenanya tidak berbahaya ... Jika ini adalah server yang menghadap web, saya akan setuju dengan Anda, tetapi server web internal, hanya lokal, pengalihan mode ini tidak akan menjadi masalah.
Stese
@verdy_p Saya sedang mengerjakan pengalihan HTTPS ke HTTP 302, untuk portal captive. Bisakah Anda mengarahkan saya ke dokumentasi yang Anda maksud?
jprusakova
Untuk portal captive Anda, jangan pernah melakukan HTTPS ke HTTP 302 redirect kecuali jika ini persis ke domain yang sama (bahkan bukan subdomain). Dan karena ada risiko tinggi pengungkapan informasi, waspadalah terhadap token dan cookie sesi yang diteruskan secara transparan dengan pengalihan! Anda harus tahu bahwa target HTTP dapat diubah dan informasi yang diambil oleh proxy transparan malware dan bahkan oleh DNS jahat: pelanggan Anda mungkin tidak tahu bahwa target Anda hanya HTTP tidak akan dapat dijangkau dan akan benar-benar pergi ke blackhat! Jadi jangan pernah lakukan itu pada tautan HTTPS yang berisi sesi / cookie / permintaan pribadi.
verdy_p
Pengalihan HTTPS 302 tersebut selalu menjadi lubang keamanan di situs HTTPS Anda. Risiko besar adalah sesi yang dicuri dan pengguna terotentikasi Anda memiliki akun pribadi mereka dipanen. Dan dalam semua kasus, JANGAN PERNAH melakukan arahan ulang untuk memuat javascripts, atau multimedia aktif: ini adalah pintu terbuka di ranah "kotak pasir" HTTPS. Sangat mempertimbangkan untuk melakukan sesuatu yang sebaliknya: mengarahkan HTTP ke HTTPS (terutama portal utama Anda atau halaman publik statis yang tidak memerlukan data pribadi / sesi / cookie) dan gunakan HTTPS untuk selamanya. Jika Anda perlu
beralih

Jawaban:

128

Ini belum diuji tetapi saya pikir ini harus bekerja menggunakan mod_rewrite

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
ejunker
sumber
1
Bagaimana cara membuatnya berfungsi (apa yang harus saya ubah dari kode ini ke domain saya agar kode ini berfungsi)?
Enve
1
Enve: Cukup tambahkan ke konfigurasi vhost_ssl.conf situs Anda (atau .htaccess di root situs). Tidak ada yang perlu diubah karena secara dinamis akan menggunakan nama host dan jalur url yang sama.
Darren Felton
1
Saya pikir Anda mungkin juga ingin menangkap string kueri. Saya tidak yakin, tapi saya pikir cuplikan di atas tidak akan meneruskan string kueri dari https ke http.
Rustavore
12
Seperti yang ditunjukkan oleh Kieron di bawah, ini tidak akan berfungsi jika server mirror tidak memiliki sertifikat yang valid. Anda masih akan melihat peringatan merah besar karena sertifikat tidak valid. Setelah Anda mulai menggunakan https, pada dasarnya Anda terjebak dengannya. Bersiaplah untuk membayarnya sepanjang sisa hidup Anda. Jika Anda berhenti membayar, orang yang mem-bookmark tautan https tidak akan bisa masuk.
Stephen Cheng
2
Membayar untuk sisa hidup Anda? Anda masih dapat menggunakan HTTPS tetapi ubah penyedia PKI Anda dan dapatkan sertifikat baru yang lebih murah. Anda masih akan membayar beberapa dolar ya, tetapi hal yang sama berlaku untuk nama domain dan hosting Anda! Sertifikat PKI sekarang TIDAK mahal dibandingkan dengan nama domain, dan tidak signifikan dibandingkan dengan biaya hosting / bandwidth!
verdy_p
71

Perlu diingat bahwa mesin Rewrite hanya menendang begitu permintaan HTTP telah diterima - yang berarti Anda masih membutuhkan sertifikat, agar klien mengatur koneksi untuk mengirim permintaan selesai!

Namun jika mesin cadangan tampaknya memiliki nama host yang sama (sejauh menyangkut klien), maka seharusnya tidak ada alasan Anda tidak dapat menggunakan sertifikat yang sama dengan mesin produksi utama.

Kieron
sumber
1
Bagaimana batasan ini dapat diatasi? Saya memiliki masalah yang sama. mendapatkan kesalahan sertifikat dari browser sebelum pengalihan.
Sandeep Balagopal
Akan menyenangkan untuk memiliki pengalihan kembali ke HTTP jika ada kesalahan sertifikat
Jeffrey the Giraffe
Itu benar-benar mengalahkan tujuan memiliki HTTPS di tempat pertama
FluffyBeing
12

Berdasarkan jawaban ejunker, ini adalah solusi yang bekerja untuk saya, bukan pada satu server tetapi pada lingkungan cloud

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
antoniom
sumber
Menggunakan 301 bisa sedikit berbahaya. 301 berarti permenantly dihapus dan saya kira pergi dari https ke http sementara. Lihat jawaban yang diterima ini untuk apa kontra akan bagi pengguna stackoverflow.com/questions/1393280/…
yusuf tezel
Perbedaan 301/302 permanen / sementara hanya relevan untuk mesin pencari.
matthewv789
9

Bagi mereka yang menggunakan .conffile.

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>
Rick
sumber
8

Jika tidak ada solusi di atas yang berfungsi untuk Anda (mereka tidak melakukannya untuk saya), inilah yang bekerja di server saya:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
rg88
sumber
6
Sering kali, Anda tidak menginginkan L,(yang berarti "Aturan terakhir"). Jika Anda menggunakan wordpress atau CMS lain, Lflag tersebut dapat mencegah permintaan halaman agar tidak dirutekan dengan benar. Alih-alih gunakan:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore
5

semua hal di atas tidak berfungsi ketika saya menggunakan cloudflare, ini berfungsi untuk saya:

RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

dan yang ini pasti bekerja tanpa proksi di jalan:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
mikulabc
sumber
3

Lebih baik menghindari penggunaan mod_rewrite saat Anda bisa.

Dalam kasus Anda, saya akan mengganti Tulisan Ulang dengan ini:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

The <If>direktif ini hanya tersedia di Apache 2.4+ per ini blog di sini .

sys0dm1n
sumber
Di lingkungan yang dihosting, seseorang dapat memeriksa versi Apache menggunakan/usr/sbin/httpd -v
Serge Stroobandt
1

ini bekerja untuk saya.

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

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

pastikan untuk mendengarkan port 80 dan 443.

jaxarroyo
sumber
0

Tidak ada satu pun jawaban yang berfungsi untuk saya di situs web Wordpress selain mengikuti karya (mirip dengan jawaban lain tetapi ada sedikit perubahan)

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Yuseferi
sumber
Jangan gunakan aturan seperti itu secara membabi buta dengan semua REQUEST_URI (ini tidak boleh digunakan jika ada data formulir dalam URI, atau cookie / sesi ID dalam metadata permintaan). Gunakan hanya untuk halaman / gambar publik statis. Hindari sepenuhnya untuk javascripts atau komponen aktif (terutama stream video yang dapat skrip, atau PDF aktif kecuali jika mereka ditandatangani secara digital oleh Anda! Masih tidak mungkin untuk menandatangani javascripts secara digital, simpan di domain aman Anda saja).
verdy_p
Catatan: beberapa format gambar aktif dan skrip: waspadai SVG misalnya. Kami telah melihat serangan pada beberapa situs web HTTPS yang memuat gambar SVG dari HTTP (dengan pengalihan situs 302), dan dipanen oleh malware yang memasukkan skrip ke dalam konten SVG ... Idealnya browser harus mengisolasi subkonten HTTP dari HTTPS dan meletakkannya di kotak pasir (jadi CORS pembatasan keamanan harus berlaku juga, bahkan jika itu dalam nama domain yang sama ...) jadi "http: // (domain) / ..." dan "https: // (domain) /" dianggap sebagai domain yang berbeda untuk CORS (bukan asal yang sama) bahkan jika mereka berada di nomor port TCP yang sama.
verdy_p
@verdy_p, apa sebenarnya yang Anda maksud dengan "dengan pengalihan 302 situs"? Anda harus memiliki situs server terlebih dahulu (atau node peserta pada tingkat TCP / IP, seperti server DNS, router), untuk mengeksploitasi permintaan sumber daya HTTP itu, bukan?
Sz.
Belum tentu. HTTPS pada domain akan aman sementara HTTP pada domain yang sama tidak akan (eksploit tidak perlu mengontrol IP atau router, atau server DNS bahkan ketika menggunakan DNSSEC; eksploit dapat menggunakan spoofing IP, yang tidak dapat dideteksi dengan aman tanpa HTTPS aktif sesi aman). Jadi saya berpendapat bahwa situs HTTPS harus meng-host gambar (bahkan pada domain yang sama) dengan tidak menayangkannya dengan HTTP (bahkan ditolak secara default di beberapa browser yang memerlukan klik aktivasi atau menutupi gambar-gambar yang tidak aman). HTTPS / HTTP campuran harus dilarang: situs ini dapat diserang pada bagian HTTP-nya (mis. Trek piksel).
verdy_p
-6

Sejauh yang saya ketahui tentang penyegaran meta sederhana juga berfungsi tanpa menyebabkan kesalahan:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">
RobinUS2
sumber
12
Saya berharap pemilih akan diminta untuk meninggalkan komentar menjelaskan alasan untuk suara turun. Secara pribadi, saya tidak akan memilih jawaban ini kecuali jika Anda sebagai pengembang tidak memiliki akses ke server yang Anda kembangkan tetapi Anda memang memiliki akses ke halaman tersebut. Satu masalah, adalah Anda harus meng-hardcode setiap jalur di setiap halaman untuk membuatnya berfungsi. Jika Anda dapat mengasumsikan bahwa JavaScript diaktifkan untuk kasus penggunaan penting Anda, Anda sebaiknya menggunakan JavaScript untuk mengubah ke http. Jawaban di atas lebih baik karena mereka tidak memerlukan javascript karena terjadi di server.
Rustavore
2
Cukup: karena htaccess adalah pilihan yang jauh lebih baik dari itu. Juga, itu tidak akan memperbaiki masalah untuk mengarahkan ulang protokol https ke http jika Anda tidak memiliki sertifikat.
midudev
1
Tindakan harus diproses oleh server, bukan dokumen 'a' yang dilayaninya.
albal