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?
http://
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?
http://
Jawaban:
Pembaruan: Meskipun jawaban ini telah diterima beberapa tahun yang lalu, perhatikan bahwa pendekatannya sekarang direkomendasikan untuk tidak dilakukan oleh dokumentasi Apache. Gunakan Redirect
saja. Lihat jawaban ini .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
pengalihan ke https://server/foo?email=someone%2540example.com
yaitu tanda "@" mendapat URL yang dikutip dua kali . Menggunakan metode dalam jawaban ssc @ tidak memiliki masalah ini.
In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
The docs Apache merekomendasikan menggunakan penulisan ulang:
Untuk mengarahkan ulang
http
URLhttps
, 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
seperti yang ditanyakan dalam pertanyaan.
Artikel ini mungkin muncul hanya setelah pertanyaan diajukan dan dijawab, tetapi tampaknya cara saat ini untuk pergi.
permanent
kata kunci, efeknya sama (browser menerima 301 redirect). Contoh:Redirect permanent "/" "https://example.com"
Saya akan merekomendasikan dengan 301 redirect:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
Seperti yang saya katakan dalam pertanyaan ini , saya sarankan Anda menghindari mengarahkan semua permintaan HTTP ke HTTPS mereka secara membabi buta, karena dapat menyebabkan Anda kesan palsu tentang keamanan. Sebaliknya, 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 yang ditayangkan melalui HTTPS memiliki formulir yang mengatakan <form action="http://example.com/doSomething">
dan mengirim beberapa data yang tidak boleh dikirim dengan jelas, browser pertama-tama akan mengirim permintaan penuh (termasuk entitas, jika itu POST) ke situs HTTP pertama. Pengalihan akan segera dikirim ke browser dan, karena sejumlah besar pengguna menonaktifkan atau mengabaikan peringatan, 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 dalam pertanyaan ini. )
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]
http://www.example.com/...
karena kedua kondisi secara implisit DAN. Mereka seharusnya OR'd sebagai gantinya, yaitu. termasuk OR
bendera pada kondisi pertama (dan ingat untuk melarikan diri dari titik-titik literal di regex). Tetapi jika Anda menerapkan HSTS maka Anda tidak ingin mengalihkan ke HTTPS dan www dalam satu pengalihan, Anda harus mengalihkan ke HTTPS terlebih dahulu .
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
.htaccess
? Juga, tautan itu sudah mati.
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]
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.
Ini adalah metode yang tepat untuk mengarahkan HTTP ke HTTPS menggunakan .htaccess menurut GoDaddy.com. Baris kode pertama cukup jelas. Baris kedua kode memeriksa untuk melihat apakah HTTPS tidak aktif, dan jika demikian, HTTP dialihkan 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
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 .htaccess
file. Dalam hal ini Anda dapat menggunakan RewriteEngine dari Apache :
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 dapat berubah pikiran tentang pengalihan ini. Browser mengingatnya untuk waktu yang sangat lama dan tidak akan memeriksa apakah itu berubah.
Anda mungkin tidak perlu baris pertama RewriteEngine On
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']);
}
.htaccess
file?
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]
Lakukan semua yang dijelaskan di atas untuk pengalihan. Cukup tambahkan "Keamanan Transportasi HTTP Ketat" ke header 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
Untuk mengalihkan semua http
permintaan 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 arahan Redirect
dalam if
untuk mengarahkan http
permintaan https
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
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 mana pun itu akan sesuai untuk situasi Anda, beberapa situs akan menyalurkan semua permintaan melalui satu file PHP, yang lain melayani berbagai halaman tergantung pada kebutuhan mereka dan permintaan dibuat ):
<?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.
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?
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 direktif 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 sedang saya kerjakan).
ambil kode ini untuk Anda. File htaccess. Redirect HTTP ke HTTPS secara otomatis
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
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]
Ini mengalihkan semua URL ke https dan www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Jika Anda ingin melakukannya dari server kucing jantan ikuti langkah-langkah di bawah ini
Di Server HTTP Apache Tomcat (8.5.x) yang berdiri sendiri, bagaimana cara mengonfigurasinya sehingga jika pengguna mengetikkan www.domain.com, mereka akan secara otomatis diteruskan ke situs https (www.domain.com).
Metode 2 langkah termasuk yang berikut ini di [Tomcat_base] /conf/web.xml Anda sebelum tag penutup
step 1:
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
dan mengatur pengaturan konektor [Tomcat_base] /conf/server.xml:
step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>
Catatan: Jika Anda sudah melakukan konfigurasi https dan mencoba untuk mengarahkan ulang lakukan langkah 1 saja.
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
Keunggulan lain dari masalah ini adalah ketika Load Balancer berperan.
Situasi adalah sebagai berikut: - Lalu lintas dari browser ke Load Balancer, dan kembali, adalah (seharusnya) HTTPS - Lalu lintas antara Load Balancer dan WebServer sebenarnya adalah HTTP.
Jadi, semua variabel permintaan server dalam PHP atau Apache menunjukkan bahwa koneksi hanya HTTP. Dan direktori HTTP dan HTTPS di Server sama.
RewriteCondition dalam jawaban yang disetujui tidak berfungsi. Ini memberikan satu lingkaran 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 :-))
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 / pusat pengetahuan / 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.
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 dialihkan secara normal tanpa masalah. File .htaccess terletak di folder root situs web (misalnya bernama public_html). Dimungkinkan untuk menggunakan RewriteCond% {SERVER_PORT}! ^ 443 $ sebagai gantinya RewriteCond% {HTTPS}! On
httpd
, bukan dengan PHP.